Ich möchte zwei Sammlungen (in C #) vergleichen, bin mir aber nicht sicher, wie ich dies am besten effizient implementieren kann.
Ich habe den anderen Thread über Enumerable.SequenceEqual gelesen , aber es ist nicht genau das, wonach ich suche.
In meinem Fall wären zwei Sammlungen gleich, wenn beide dieselben Artikel enthalten (unabhängig von der Reihenfolge).
Beispiel:
collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};
collection1 == collection2; // true
Was ich normalerweise mache, ist, jedes Element einer Sammlung zu durchlaufen und zu prüfen, ob es in der anderen Sammlung vorhanden ist, dann jedes Element der anderen Sammlung zu durchlaufen und zu prüfen, ob es in der ersten Sammlung vorhanden ist. (Ich beginne mit dem Vergleich der Längen).
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
Dies ist jedoch nicht ganz richtig und wahrscheinlich nicht die effizienteste Methode, um zwei Sammlungen auf Gleichheit zu vergleichen.
Ein Beispiel, das ich mir vorstellen kann, wäre falsch:
collection1 = {1, 2, 3, 3, 4}
collection2 = {1, 2, 2, 3, 4}
Welches wäre gleich mit meiner Implementierung. Sollte ich nur zählen, wie oft jeder Artikel gefunden wurde, und sicherstellen, dass die Anzahl in beiden Sammlungen gleich ist?
Die Beispiele sind in einer Art C # (nennen wir es Pseudo-C #), aber geben Sie Ihre Antwort in einer beliebigen Sprache, es spielt keine Rolle.
Hinweis: Der Einfachheit halber habe ich in den Beispielen Ganzzahlen verwendet, möchte aber auch Objekte vom Referenztyp verwenden können (sie verhalten sich nicht korrekt als Schlüssel, da nur die Referenz des Objekts verglichen wird, nicht der Inhalt).
quelle
Antworten:
Es stellt sich heraus, dass Microsoft dies bereits in seinem Testframework behandelt hat: CollectionAssert.AreEquivalent
Mit Reflektor habe ich den Code hinter AreEquivalent () geändert, um einen entsprechenden Gleichheitsvergleicher zu erstellen. Es ist vollständiger als vorhandene Antworten, da es Nullen berücksichtigt, IEqualityComparer implementiert und einige Effizienz- und Randfallprüfungen aufweist. Außerdem ist es Microsoft :)
Beispielnutzung:
Oder wenn Sie nur zwei Sammlungen direkt vergleichen möchten:
Schließlich können Sie einen Gleichstellungsvergleicher Ihrer Wahl verwenden:
quelle
EqualityComparer
(entweder dem von Ihnen angegebenen oderEqualityComparer.Default
Sie können Reflector oder die Referenzquelle überprüfen, um dies zu überprüfen). Wenn sich Objekte während der Ausführung dieser Methode ändern (und insbesondere ihr Hashcode ändert), sind die Ergebnisse zwar unerwartet, dies bedeutet jedoch nur, dass diese Methode in diesem Kontext nicht threadsicher ist.EqualityComparer
EqualityComparer.Default
Equals
wegen derIEqualityComparer<T>
Schnittstelle benannt werden. Was Sie sich ansehen sollten, ist der Name des Vergleichers selbst . In diesem FallMultiSetComparer
macht es Sinn.