Ich denke nicht, dass Sie Equals dafür verwenden sollten. Menschen haben eine sehr explizite Vorstellung davon, was Gleichheit bedeutet, und wenn die IDs unterschiedlich sind, aber der Code oder der Name identisch sind, würde ich diese "Gleich" nicht berücksichtigen. Vielleicht brauchen Sie eine andere Methode wie "IsCompatible".
Wenn Sie sie gruppieren möchten, können Sie die Erweiterungsmethode ToLookup () für eine Liste dieser Objekte verwenden, um ein Prädikat zu verwenden, das Ihre IsCompatible-Methode wäre. Dann würden sie gruppiert werden.
Dies ist eine schreckliche Definition von GetHashCode
, weil es nicht transitiv ist.
Betrachten Sie
%Vor% Dann Equals
und GetHashCode
aber %code% .
Zusätzlich können wir feststellen, dass die einzige sinnvolle Implementierung von %code% eine konstante Map ist.
Angenommen, %code% und %code% sind unterschiedliche Objekte. Lassen Sie %code% das Objekt
sein %Vor%Dann %code% und %code% , so dass %code% und %code% das %code% festlegen. Da %code% und %code% willkürlich waren, haben wir festgestellt, dass %code% konstant ist.
Somit haben wir gezeigt, dass die einzige mögliche Implementierung von %code%
ist %Vor%All dies zusammen macht deutlich, dass Sie das Konzept, das Sie ausprobieren möchten, überdenken müssen und eine andere Definition von %code% finden.
Die goldene Regel lautet: Wenn die Objekte gleich sind, müssen sie den gleichen Hash-Code erzeugen.
Daher wäre eine konforme (aber sagen wir, unerwünschte) Implementierung
%Vor%Ehrlich gesagt, wenn %code% , %code% und %code% unabhängig voneinander sind, weiß ich nicht, ob Sie es besser machen können. Objekte dieses Typs in eine Hash-Tabelle zu bringen, wird sehr schmerzhaft sein.
Dies ist eine schreckliche Definition von Equals
, weil es nicht transitiv ist.
Betrachten Sie
%Vor% Dann x == y
und y == z
aber x != z
.
Zusätzlich können wir feststellen, dass die einzige sinnvolle Implementierung von GetHashCode
eine konstante Map ist.
Angenommen, x
und y
sind unterschiedliche Objekte. Lassen Sie z
das Objekt
Dann x == z
und y == z
, so dass x.GetHashCode() == z.GetHashCode()
und y.GetHashCode() == z.GetHashCode()
das x.GetHashCode() == y.GetHashCode()
festlegen. Da x
und y
willkürlich waren, haben wir festgestellt, dass GetHashCode
konstant ist.
Somit haben wir gezeigt, dass die einzige mögliche Implementierung von GetHashCode
All dies zusammen macht deutlich, dass Sie das Konzept, das Sie ausprobieren möchten, überdenken müssen und eine andere Definition von Equals
finden.
Ich denke nicht, dass Sie Equals dafür verwenden sollten. Menschen haben eine sehr explizite Vorstellung davon, was Gleichheit bedeutet, und wenn die IDs unterschiedlich sind, aber der Code oder der Name identisch sind, würde ich diese "Gleich" nicht berücksichtigen. Vielleicht brauchen Sie eine andere Methode wie "IsCompatible".
Wenn Sie sie gruppieren möchten, können Sie die Erweiterungsmethode ToLookup () für eine Liste dieser Objekte verwenden, um ein Prädikat zu verwenden, das Ihre IsCompatible-Methode wäre. Dann würden sie gruppiert werden.
Die goldene Regel lautet: Wenn die Objekte gleich sind, müssen sie den gleichen Hash-Code erzeugen.
Daher wäre eine konforme (aber sagen wir, unerwünschte) Implementierung
%Vor% Ehrlich gesagt, wenn Id
, Name
und Code
unabhängig voneinander sind, weiß ich nicht, ob Sie es besser machen können. Objekte dieses Typs in eine Hash-Tabelle zu bringen, wird sehr schmerzhaft sein.
Tags und Links c# matching properties equals gethashcode