IEQuatables Implementierung wird nur aufgerufen, wenn die Basis Equals überschrieben wird

8

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?

    
Kev Hunter 30.09.2011, 15:49
quelle

2 Antworten

9

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

verglichen werden

Im Allgemeinen, wenn Sie IEquatable<T> implementieren, sollten Sie immer

  • Überschreibe Object.Equals
  • Überschreibe 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%     
JaredPar 30.09.2011, 15:57
quelle
3

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.

    
Jim Mischel 30.09.2011 16:00
quelle

Tags und Links