Je voudrais comparer deux collections (en C #), mais je ne suis pas sûr de la meilleure façon de l'implémenter efficacement.
J'ai lu l'autre fil de discussion sur Enumerable.SequenceEqual , mais ce n'est pas exactement ce que je recherche.
Dans mon cas, deux collections seraient égales si elles contiennent toutes les deux les mêmes éléments (quel que soit l'ordre).
Exemple:
collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};
collection1 == collection2; // true
Ce que je fais habituellement, c'est de parcourir chaque élément d'une collection et de voir s'il existe dans l'autre collection, puis de parcourir chaque élément de l'autre collection et de voir s'il existe dans la première collection. (Je commence par comparer les longueurs).
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
Cependant, ce n'est pas tout à fait correct et ce n'est probablement pas le moyen le plus efficace de comparer deux collections pour l'égalité.
Un exemple auquel je pense que ce serait faux est:
collection1 = {1, 2, 3, 3, 4}
collection2 = {1, 2, 2, 3, 4}
Ce qui serait égal à ma mise en œuvre. Dois-je simplement compter le nombre de fois où chaque élément est trouvé et m'assurer que les nombres sont égaux dans les deux collections?
Les exemples sont dans une sorte de C # (appelons-le pseudo-C #), mais donnez votre réponse dans la langue que vous souhaitez, cela n'a pas d'importance.
Remarque: j'ai utilisé des entiers dans les exemples par souci de simplicité, mais je veux pouvoir utiliser également des objets de type référence (ils ne se comportent pas correctement comme des clés car seule la référence de l'objet est comparée, pas le contenu).