Gostaria de comparar duas coleções (em C #), mas não tenho certeza da melhor maneira de implementar isso com eficiência.
Eu li o outro tópico sobre Enumerable.SequenceEqual , mas não é exatamente o que estou procurando.
No meu caso, duas coleções seriam iguais se ambas contivessem os mesmos itens (não importa a ordem).
Exemplo:
collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};
collection1 == collection2; // true
O que eu costumo fazer é percorrer cada item de uma coleção e ver se existe na outra coleção, depois percorrer cada item da outra coleção e ver se existe na primeira coleção. (Começo comparando os comprimentos).
if (collection1.Count != collection2.Count)
return false; // the collections are not equal
foreach (Item item in collection1)
{
if (!collection2.Contains(item))
return false; // the collections are not equal
}
foreach (Item item in collection2)
{
if (!collection1.Contains(item))
return false; // the collections are not equal
}
return true; // the collections are equal
No entanto, isso não está totalmente correto e provavelmente não é a maneira mais eficiente de comparar duas coleções de igualdade.
Um exemplo em que posso pensar que seria errado é:
collection1 = {1, 2, 3, 3, 4}
collection2 = {1, 2, 2, 3, 4}
O que seria igual à minha implementação. Devo apenas contar o número de vezes que cada item é encontrado e garantir que as contagens sejam iguais nas duas coleções?
Os exemplos estão em algum tipo de C # (vamos chamá-lo de pseudo-C #), mas dê sua resposta no idioma que você desejar, não importa.
Nota: Eu usei números inteiros nos exemplos por simplicidade, mas quero poder usar objetos do tipo referência também (eles não se comportam corretamente como chaves porque apenas a referência do objeto é comparada, não o conteúdo).