2009-06-11 3 views
1

Sie würden denken, dass, wenn zwei Wörterbücher die gleichen Schlüssel und Werte enthielten, sie den gleichen Hash-Code zurückbringen würden und gleich gleich sein würden? aber sie tun nicht - was mache ich falsch? oder wie vergleiche ich Wörterbücher auf diese Weise?Dictionary (TKey, TValue) GetHashCode und Equals - Wie funktionieren sie?

Danke. Code simpleple unter

/In diesem Fall möchte ich auch die Bestellung ist die gleiche/gleich.

 SortedDictionary<int,string> sd1 = new SortedDictionary<int,string>(); 
     sd1.Add(1,"one"); 
     sd1.Add(2, "two"); 
     sd1.Add(5, "five"); 
     int sd1Hash = sd1.GetHashCode(); 

     SortedDictionary<int, string> sd2 = new SortedDictionary<int, string>(); 
     sd2.Add(1, "one"); 
     sd2.Add(2, "two"); 
     sd2.Add(5, "five"); 
     int sd2Hash = sd2.GetHashCode(); 

     //This is false 
     bool areEqual = sd1.Equals(sd2); 

Antwort

4

Wenn Sie testen wollen, dass die Sammlungen gleich sind, einschließlich ihrer Bestellung:

bool areEqual = sd1.SequenceEqual(sd2); 

Wenn Sie die Sammlungen als ungeordnete Sätze behandeln wollte:

bool areEqual = 
    (sd1.Count == sd2.Count) && (sd1.Intersect(sd2).Count() == sd1.Count); 

(SequenceEqual und Intersect können bei Bedarf auch einen IEqualityComparer Parameter verwenden.)

Wie mehrere andere Antworten angegeben haben, überschreibt SortedDictionary nicht die Standardimplementierungen von Equals oder GetHashCode. Die Standardimplementierung von Equals verwendet die Referenzgleichheit und gibt false zurück, da Sie zwei separate Objekte vergleichen.

+1

Es ist mir eine ganze Weile dauerte, dass diese Methode in .NET 2.0 nicht verfügbar, um herauszufinden ist. Kennen Sie irgendeine Alternative für .NET 2.0? – Aamir

+1

Sie müssen Ihren eigenen IEqualityComparer > implementieren, der auf den Inhalt der Wörterbücher schaut, um den Hashcode und die Gleichheit stattdessen zu bestimmen – thecoop

+1

@Aamir, soweit ich weiß, gibt es keine eingebaute Alternative für .NET2, obwohl es nicht schwierig ist, eine eigene Methode zu schreiben, die beide Sammlungen gleichzeitig durchläuft und jedes Element der Reihe nach vergleicht (was genau die SequenceEqual-Methode ist). – LukeH

0

Sie würden denken, dass, wenn zwei Wörterbücher die gleichen Schlüssel und Werte enthielten, sie den gleichen Hash-Code zurückbringen und gleich sein würden, richtig?

Nein, dies ist nicht, wie die Methoden Equals und GetHashcode implementiert sind. Sie werden nicht überschrieben, daher ist dies die standardmäßige System.Object-Implementierung, die nur Verweise vergleicht.

0

Sie können für dieses Problem MSDN Check-out:

Die Standardimplementierung von Equals Referenz Gleichheit für Referenztypen unterstützt, und bitweise für Werttypen Gleichheit. Referenzgleichheit bedeutet, dass die Objektreferenzen, die verglichen werden, sich auf dasselbe Objekt beziehen. Bitweise Gleichheit bedeutet, dass die Objekte, die verglichen werden, dieselbe binäre Darstellung haben.

So, da das SortedDictionary Referenzen enthält, werden sie verglichen. und diese sind offensichtlich anders.

können Sie weitere Informationen finden Sie unter: http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

Verwandte Themen