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.
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%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!)
Warum schreiben Sie nicht Ihre eigene Gleichheits-Methode? dh
%Vor%Dabei ist IsEqualTo in Ihrer Benutzerklasse definiert als:
%Vor%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%