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:
NET - Unit of Work - Padrão Unidade de ...