Damit eine Klasse in einer Hashtabelle oder einem Wörterbuch arbeiten kann, müssen Sie GetHashCode()
implementieren! Ich habe keine Ahnung, warum es in HashSet funktioniert; Ich denke, es war nur Glück.
Beachten Sie, dass es gefährlich ist, muable Felder für die Berechnung von Equals oder GetHashCode() zu verwenden. Warum? Bedenken Sie:
var x = new Int16_2D { a = 1, b = 2 };
var set = new HashSet<Int16_2D> { x };
var y = new Int16_2D { a = 1, b = 2 };
Console.WriteLine(set.Contains(y)); // True
x.a = 3;
Console.WriteLine(set.Contains(y)); // False
Console.WriteLine(set.Contains(x)); // Also false!
Mit anderen Worten, wenn Sie setzen x.a = 3;
Sie ändern Hash-Code des x. Aber die x-Position in der Hash-Tabelle basiert auf seinem alten Hash-Code, so dass x im Grunde jetzt verloren ist. Sehen Sie dies in Aktion bei http://ideone.com/QQw08
Auch, wie svick Notizen, Implementierung Equals
implementiert nicht ==
. Wenn Sie nicht ==
implementieren, die ==
wird von einem Operator eine Referenz Vergleich liefern, so:
var x = new Int16_2d { a = 1, b = 2 };
var y = new Int16_2d { a = 1, b = 2 };
Console.WriteLine(x.Equals(y)); //True
Console.WriteLine(x == y); //False
Abschließend sind Sie besser dran dies eine unveränderliche Art zu machen; Da es nur 4 Bytes lang ist, würde ich es wahrscheinlich zu einer unveränderlichen Struktur machen.
http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method-is-overriden-in-c –
Beachten Sie, dass Sie nicht wirklich sind Die Implementierung von '==', 'Equals()' ist etwas anderes. – svick