Sequência LINQ igual

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); // TrueLinguagem de código:  C#  ( cs )

Saída:

TrueLinguagem 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); // FalseLinguagem de código:  C#  ( cs )

Neste exemplo, o SequenceEqual()método retorna falsequando 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 Personclasse com duas propriedades SSNe 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 Personobjetos:

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}"); // FalseLinguagem de código:  C#  ( cs )

Saída:

FalseLinguagem de código:  C#  ( cs )

Retorna falso mesmo que pareçam ter os mesmos elementos na mesma ordem. O SequenceEqual()método compara o Personobjeto 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 trueporque 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}"); // TrueLinguagem de código:  C#  ( cs )

Saída:

TrueLinguagem de código:  C#  ( cs )

Resumo

  • Use o SequenceEqual()método para comparar duas sequências. Ele retorna truese eles contiverem os mesmos elementos na mesma ordem.
  • Use um personalizado EqualityComparerpara substituir o comparador de igualdade padrão.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *