Resumo : neste tutorial, você aprenderá como usar SequenceEqual()
o método LINQ para comparar duas sequências.
Introdução ao método LINQ SequenceEqual
O Sequence()
método permite comparar duas sequências e retornar verdadeiro se elas contiverem os mesmos elementos na mesma ordem .
Aqui está a sintaxe do SequenceEqual()
método:
bool SequenceEqual<TSource> (
this IEnumerable<TSource> first,
IEnumerable<TSource> second
);
Linguagem de código: C# ( cs )
Nesta sintaxe, o primeiro e o segundo parâmetros são sequências com o tipo IEnumerable<T> que você deseja comparar. Por padrão, o SequenceEqual()
método compara os elementos nas sequências por suas referências, se forem objetos, ou por seus valores, se forem tipos primitivos.
Se quiser substituir o comparador padrão, você pode implementar seu próprio IEqualityComparer
<T> e passá-lo para o SequenceEqual()
método:
bool SequenceEqual<TSource> (
this IEnumerable<TSource> first,
IEnumerable<TSource> second,
IEqualityComparer<TSource>? comparer
);
Linguagem de código: C# ( cs )
Exemplos de métodos LINQ SequenceEqual()
Vamos explorar alguns exemplos de uso do SequenceEqual()
método.
1) Usando SequenceEqual() para comparar duas listas de inteiros
O exemplo a seguir usa o SequenceEqual()
método para comparar duas listas de inteiros. Retorna verdadeiro porque ambas as listas possuem os mesmos elementos na mesma ordem:
using static System.Console;
var num1 = new List<int> { 1, 2, 3 };
var num2 = new List<int> { 1, 2, 3 };
var result = num1.SequenceEqual(num2);
WriteLine(result); // True
Linguagem de código: C# ( cs )
Saída:
True
Linguagem de código: C# ( cs )
O exemplo a seguir retorna false mesmo que ambas as listas contenham os mesmos elementos, seus elementos não estão na mesma ordem:
using static System.Console;
var num1 = new List<int> { 1, 2, 3 };
var num2 = new List<int> { 1, 3, 2 };
var result = num1.SequenceEqual(num2);
WriteLine(result); // False
Linguagem de código: C# ( cs )
Neste exemplo, o SequenceEqual()
método retorna false
quando descobre que o segundo elemento da primeira lista não é igual ao segundo elemento da segunda lista.
2) Usando SequenceEqual() para comparar duas listas de objetos
Suponha que você tenha uma Person
classe com duas propriedades SSN
e Name
:
public class Person
{
public required string SSN
{
get; set;
}
public required string Name
{
get; set;
}
}
Linguagem de código: C# ( cs )
O programa a seguir usa o SequenceEqual()
método para comparar duas listas de Person
objetos:
using static System.Console;
var members1 = new List<Person>
{
new Person() { SSN="111222333", Name="John Doe" },
new Person() { SSN="111222334", Name="Jane Doe" }
};
var members2 = new List<Person>
{
new Person() { SSN="111222333", Name="John Doe" },
new Person() { SSN="111222334", Name="Jane Doe" }
};
var isEqual = members1.SequenceEqual(members2);
WriteLine($"isEqual: {isEqual}"); // False
Linguagem de código: C# ( cs )
Saída:
False
Linguagem de código: C# ( cs )
Retorna falso mesmo que pareçam ter os mesmos elementos na mesma ordem. O SequenceEqual()
método compara o Person
objeto por referência.
Para substituir o comparador de igualdade padrão, você pode implementar um arquivo PersonComparer
. Suponha que dois objetos Person sejam iguais se tiverem o mesmo número de previdência social ( SSN
):
public class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person? x, Person? y)
{
// Check for null values
if (x == null || y == null)
return false;
// Check if the two Person objects are the same reference
if (ReferenceEquals(x, y))
return true;
// Compare the SSN of the two Person objects
// to determine if they're the same
return x.SSN == y.SSN;
}
public int GetHashCode(Person? obj)
{
if (obj == null || obj.SSN == null)
return 0;
// Use the SSN of the Person object
// as the hash code
return obj.SSN.GetHashCode();
}
}
Linguagem de código: C# ( cs )
O programa a seguir usa o SequenceEqual()
método com o PersonComparer
. Ele retorna true
porque as listas contêm os mesmos elementos na mesma ordem:
using static System.Console;
var members1 = new List<Person>
{
new Person() { SSN="111222333", Name="John Doe" },
new Person() { SSN="111222334", Name="Jane Doe" }
};
var members2 = new List<Person>
{
new Person() { SSN="111222333", Name="John Doe" },
new Person() { SSN="111222334", Name="Jane Doe" }
};
var isEqual = members1.SequenceEqual(
members2,
new PersonComparer()
);
WriteLine($"isEqual: {isEqual}"); // True
Linguagem de código: C# ( cs )
Saída:
True
Linguagem de código: C# ( cs )
Resumo
- Use o
SequenceEqual()
método para comparar duas sequências. Ele retornatrue
se eles contiverem os mesmos elementos na mesma ordem. - Use um personalizado
EqualityComparer
para substituir o comparador de igualdade padrão.