Wie überprüfe ich, ob zwei Objekte nur hinsichtlich ihrer Eigenschaften gleich sind, ohne die bestehende Object.Equals () zu brechen?

8

Grundsätzlich ist GethashCode anders, obwohl sie die SAME-Werte für die Eigenschaften enthalten ... Warum gibt der Standard also diff-Hashcodes zurück?

%Vor%

Gibt es einen geeigneteren Weg, um es so zu machen, dass ich die Funktionsweise von Object.Equals für meine Objekte nicht durchbricht, aber trotzdem meine eigene Gleichheitsprüfung basierend auf den Parameterwerten durchführen kann?

Der Grund, warum ich frage, ist, weil ich einen Dienst habe: SynchronizeUsers() , der ein Array von Benutzern herunterlädt. Anstatt meinen Cache von Benutzern zu löschen, möchte ich nur diejenigen aktualisieren, die aktualisiert werden müssen, die entfernen, von denen die Synchronisation sagt, und die neuen hinzufügen. Aber ich kann nicht einfach Object.Equals () auf diese Objekte anwenden.

    
michael 20.06.2011, 14:51
quelle

6 Antworten

10

Haben Sie versucht, Ihren eigenen IEqualityComparer zu implementieren? Sie können dies an eine .Equals () - Überladung übergeben, um Ihre eigene benutzerdefinierte Gleichheitslogik zu definieren, wie in

Benutzer A = Benutzer B, auch wenn sie unterschiedliche Instanzen sind, wenn die Eigenschaften x, y, z gleich sind.

Siehe: MSDN

Edit: Ich hätte schreiben sollen, dass Sie Ihren EqualityComparer instanziieren und zwei Instanzen an seine Equals () -Methode übergeben können und einen bool erhalten. Grundlegende Konsolenanwendung ... zeigt true, false, false an. Ding ist trivial, hat die zwei Eigenschaften gezeigt.

%Vor%     
pelazem 20.06.2011, 14:55
quelle
4

Wenn Sie ReSharper installiert haben (es lohnt sich!), müssen Sie nur noch:

%Vor%

Mit Ihrem Cursor innerhalb der Klasse. Eine Teilklasse ist gut zum Verstecken des Boilerplate.

Es wird automatisch eine Gleichheitsprüfung für jede Eigenschaft implementiert.

(Wählen Sie alle Eigenschaften mit Strg + A, und Sie können alle w / Space überprüfen!)

    
RJB 29.08.2015 02:16
quelle
3

Es wird empfohlen, GetHashCode () beim Überfahren von GetEquals () zu überspringen.

Ссылка

z.B.

%Vor%     
user645280 20.06.2011 14:55
quelle
0

Warum schreiben Sie nicht Ihre eigene Gleichheits-Methode? dh

%Vor%

Dabei ist IsEqualTo in Ihrer Benutzerklasse definiert als:

%Vor%     
Nathan Tregillus 20.06.2011 14:57
quelle
0

Wenn Sie nur die Hash-Funktion verwenden möchten, verwenden Sie eine Erweiterungsmethode, um den Hash zu generieren.

%Vor%

Dann könnten Sie in Ihrem Code tun:

%Vor%

Das würde alles intakt lassen und nichts anderes mehr kaputt machen. Wenn Sie nach einer Möglichkeit zum Vergleichen von Objekten suchen, können Sie dasselbe mit einer Erweiterungsmethode tun:

%Vor%

Die Verwendung wäre wie folgt:

%Vor%     
Nix 20.06.2011 15:06
quelle
0

Fügen Sie eine Methode hinzu:

%Vor%     
FlyingStreudel 20.06.2011 14:59
quelle

Tags und Links