La comparaison de deux collections pour l'égalité indépendamment de l'ordre des éléments dans leur

Je voudrais comparer deux collections (en C#), mais je ne suis pas sûr de la meilleure façon de mettre en œuvre efficacement.

J'ai lu l'autre thread sur Énumérable.SequenceEqual, mais ce n'est pas exactement ce que je cherche.

Dans mon cas, deux collections seraient égaux s'ils contiennent les mêmes éléments (peu importe l'ordre).

Exemple:

collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};

collection1 == collection2; //true

Ce que je fais habituellement est de parcourir chaque élément d'une collection et de voir si il existe dans le reste de la collection, puis en boucle sur chaque élément de la collection et de voir s'il existe dans la première collection. (Je commence à en comparant 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 faire comparer deux collections pour l'égalité.

Un exemple je pense que ce serait une erreur est:

collection1 = {1, 2, 3, 3, 4}
collection2 = {1, 2, 2, 3, 4}

Qui serait égal avec ma mise en œuvre. Dois-je simplement compter le nombre de fois que chaque élément est trouvé et assurez-vous que les chiffres sont égaux dans les deux collections?


Les exemples sont en quelque sorte de C# (appelons-le pseudo-C#), mais donner votre réponse dans la langue que vous souhaitez, il n'a pas d'importance.

Remarque: j'ai utilisé des entiers dans les exemples de la simplicité, mais je veux être en mesure d'utiliser une référence de type objets trop (ils ne se comportent pas correctement, comme les clés, parce que la seule référence de l'objet de la comparaison, pas le contenu).

  • Comment au sujet de l'algorithme? Toutes les réponses liées par comparer quelque chose, générique listes de comparer linq etc. Vraiment nous n'avons promis à quelqu'un que nous ne seront jamais d'utiliser l'algorithme, comme un vieux façonné programmeur?
  • Vous n'êtes pas vérifier pour l'Égalité vous êtes à la vérification de l'Équivalence. C'est pinailleurs, mais une distinction importante. Et il y a longtemps. C'est une bonne Q+R.
  • Vous pouvez être intéressé par ce post, qui traite d'une version écoute de la fonction de dictionnaire méthode décrite ci-dessous. Une question avec le plus simple dictionnaire approches est qu'elles ne gèrent pas correctement les valeurs null parce que .NET le Dictionnaire de la classe ne permet pas les clés null.
InformationsquelleAutor mbillard | 2008-09-08