2009-01-30 9 views
36

Ich versuche zu bestimmen, ob zwei HashSet Objekte in .NET 3.5 (C#) gleiche Mengen sind, d. H. enthalten die gleichen Werte. Dies scheint etwas zu sein, was man offensichtlich tun möchte, aber keine der bereitgestellten Funktionen scheint Ihnen diese Information zu geben.Wie bestimmen Sie, ob zwei HashSets gleich sind (nach Wert, nicht nach Referenz)?

Die Art, wie ich dies tun kann, ist zu überprüfen, ob die Anzahl der beiden Sätze gleich und ein Satz ist eine Teilmenge (nicht ordnungsgemäß) der anderen. Ich denke, der einzige Weg, der passieren kann, ist, wenn sie gleich sind. Beispielcode:

HashSet<int> set1 = new HashSet<int>(); 
set1.Add(1); 
set1.Add(2); 
set1.Add(3); 

HashSet<int> set2 = new HashSet<int>(); 
set2.Add(1); 
set2.Add(2); 
set2.Add(3); 

if(set1.Count == set2.Count && set1.IsSubsetOf(set2)) 
{ 
    // do something 
} 

Würde das immer funktionieren? Gibt es einen besseren Weg? Warum hat HashSet keine public bool IsEqualSetWith() Funktion?

+0

Während es wahr ist, dass SetEquals() funktionieren würde, es ist offensichtlich keine ideale Lösung im Hinblick auf die gute OO. Idealerweise möchte ich mit Schnittstellen wie ICollection oder IEnumerable arbeiten. Es ist kein perfektionistischer Elfenbeinturm, sondern eine sehr reale API-Design-Überlegung, wenn Sie eine Plattform entwickeln, auf der andere Entwickler aufbauen können. Wie auch immer, wenn meine API ICollection als Argument akzeptiert, möchte ich .Equals() aufrufen können, um das Argument mit einem bekannten Wert zu vergleichen. Wenn der Aufrufer gibt mir eine Liste und ich vergleiche es in meiner API-Methode mit einem Set, (Forts.) –

+1

Es heißt IEqualityComparer :) –

+0

Ich möchte mein Set-Objekt, um herauszufinden, es ist eine Liste, die ich habe und false zurückgeben. Umgekehrt, wenn der Aufrufer meine Methode mit einer Menge aufruft und es zufällig die gleichen Elemente hat, möchte ich, dass mein Set-Objekt SetEquals() intern aufruft, ohne dass ich eine spezielle Methode verwenden muss. Mit anderen Worten, verwenden Sie Polymorphismus und Verkapselung, wie es in der Schule gelehrt wird. Es schockiert mich, wie die C# -Bibliothek dies so lange verpassen kann und niemand beschwert sich. –

Antwort

69

Betrachten Sie die Methode SetEquals.

my_hashset.SetEquals(other); 
+0

Danke Michael, ich weiß nicht, wie ich das vollständig in der Methodenliste auf MSDN verpasst habe ... –

+21

Kommt allen irgendwann einmal vor. Ich kann einfach nicht glauben, dass ich sowohl Jon Skeet als auch Marc Gravell auf einer .NET-Frage geschlagen habe. Ich schätze, sie müssen irgendwann schlafen. –

4
IEqualityComparer<HashSet<int>> comp = HashSet<int>.CreateSetComparer(); 
Console.WriteLine("CreateSetComparer set1 == set2 : {0}", comp.Equals(set1, set2)); 
// or 
bool areEqual = HashSet<int>.CreateSetComparer().Equals(set1, set2); 
+0

Dies ist nützlich, wenn Sie beispielsweise ein Dictionary erstellen müssen, in dem HashSet als Schlüssel verwendet wird. – mancze

Verwandte Themen