Ich habe die folgende Klasse
%Vor%Wenn ich versuche, eine eindeutige Liste der Elemente einer Liste wie folgt zu erstellen
%Vor%zwei Elemente zurückgegeben werden, geschieht dies, bis ich die object.Equals-Methode überschreiben, sobald ich dies tun, und mein Code ist wie folgt
%Vor%Meine IEquatable Equals-Methode wird jetzt aufgerufen, aber nur, wenn ich die Basismethode überschreibe. Wenn ich außerdem einen Haltepunkt für die Objekt-Gleich-Methode schreibe, wird sie nie aufgerufen.
Warum ist das?
- UPDATE
Also mit der Produktklasse
%Vor%Wenn GetHashCode entfernt wird, wird die IEquatable-Implementierung von Equals nie getroffen. Ich verstehe, dass Sie Equals und GetHashCode im Allgemeinen zusammen implementieren sollten, ist dies der Grund?
Das Problem liegt in der ursprünglichen Implementierung, in der Sie die Methode GetHashcode
nicht überschreiben. Unter der Haube verwendet Union
eine Set<T>
-Stilstruktur, um Duplikate zu entfernen. Diese Struktur setzt Objekte basierend auf dem von GetHashCode
zurückgegebenen Wert in Buckets. Wenn der Hash-Code nicht zwischen gleichen Objekten zusammenpasst (was er tun muss), können sie möglicherweise in verschiedene Buckets gesetzt und niemals mit Equals
Im Allgemeinen, wenn Sie IEquatable<T>
implementieren, sollten Sie immer
Object.Equals
Object.GetHashCode
Wenn Sie beides nicht tun, landen Sie in Situationen wie dieser.
Beachten Sie, dass Ihre Implementierung ein wenig vereinfacht werden könnte
%Vor%Dokumentation für Enumerable.Union sagt:
Der Standard-Gleichheitsvergleich, Standard, wird verwendet, um Werte von zu vergleichen die Typen, die den IEqualityComparer (Of T) generisch implementieren Schnittstelle. Um einen benutzerdefinierten Datentyp zu vergleichen, müssen Sie dies implementieren Schnittstelle und bieten Sie Ihre eigenen GetHashCode und Equals Methoden für die Geben Sie ein.
Sie implementieren IEquatable
. Sie müssen IEqualityComparer
implementieren.