C# -  Determinar se uma coleção tem os mesmos elementos


  Hoje veremos como determinar se uma coleção possui os mesmos elementos. Um conceito básico da linguagem C#.

Para comparar duas coleções quanto à igualdade, quando o número total de ocorrências não importar, podemos usar a coleção HashSet<T>.

A classe HashSet<T> pode ser usada para armazenar, remover ou exibir elementos. Ela não armazena elementos duplicados e assim podemos usar esta classe se precisarmos armazenar apenas elementos exclusivos.

Esta classe classe fornece operações de conjunto de alto desempenho.

Obs: Um conjunto é uma coleção que não contém elementos duplicados e cujos elementos não estão em nenhuma ordem específica.

Como HashSet<T> não permite valores duplicados, podemos converter qualquer coleção em HashSet<T> e usar o método HashSet<T>.SetEquals() para determinar se o objeto HashSet<T> e a outra coleção contêm os mesmos elementos.

Os exemplos apresentandos foram criados usando o VS 2022 no ambiente do .NET 7.0.

O exemplo a seguir compara dois objetos do tipo List<T> entre si usando a classe HashSet<T> :

Resultado:

Também podemos usar o método Except() da LINQ, que retorna elementos únicos na primeira coleção que não aparecem na segunda coleção.

Assim o método Except() requer duas coleções e vai retornar uma nova coleção com elementos da primeira coleção que não existem na segunda coleção.

Nota:  Para coleção de tipos complexos este método não retorna o resultado correto;

Se você quiser comparar coleções de objetos de algum tipo de dados complexo ou personalizado, será necessário implementar a interface genérica IEquatable<T> em uma classe auxiliar.

Abaixo temos a comparação feita usando o método Except() :

Entendendo a comparação :

O código !numeros1.Except(numeros2).Any()  && !numeros2.Except(numeros1).Any();  vai retornar true pois não existem elementos na primeira coleção que não existem na segunda coleção.

resultado:

Outra abordagem é usar o método All() da LINQ.

O operador All da LINQ é usado para verificar se todos os elementos de uma fonte de dados satisfazem uma determinada condição ou não. Se todos os elementos satisfizerem a condição, ele retorna true senão retorna false.

Para isso podemos definir o código a seguir:

static bool ComparaUsandoAllLinq(List<int> numeros1, List<int> numeros2)
{
   Console.WriteLine(
"\n\nComparando usando All()");

  
bool isEqual = numeros1.All(numeros2.Contains)
                  && numeros2.All(numeros1.Contains);

  
return isEqual;
}

Resultado:

E estamos conversados...

Pegue o código aqui: ComparaColecoes1.zip

"Regozijai-vos sempre.
Orai sem cessar.
Em tudo dai graças, porque esta é a vontade de Deus em Cristo Jesus para convosco."
1 Tessalonicenses 5:16-18

Referências:


José Carlos Macoratti