C # GetHashCode Frage

8
___ answer5554774 ___

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.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ answer5554833 ___

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.

    
___ tag123properties ___ Eine Eigenschaft in einigen objektorientierten Programmiersprachen ist eine spezielle Art von Klassenmember, die zwischen einem Feld (oder Datenelement) und einer Methode liegt. Eigenschaften werden wie Felder gelesen und geschrieben, aber Lese- und Schreibvorgänge für Eigenschaften werden (normalerweise) übersetzt, um Methodenaufrufe zu erhalten und festzulegen. ___ tag123equals ___ Bezieht sich auf die Java equals-Methode, die angibt, ob ein Objekt diesem Wert "gleich" ist. ___ tag123matching ___ Bei Fragen zur Mustererkennung, Verwendung von Zeichenfolgen oder Baumstrukturen. Im Gegensatz zur Mustererkennung muss die hier beschriebene Übereinstimmung in der Regel exakt sein. ___ tag123gethashcode ___ GetHashCode ist eine Methode der Basisobjektklasse von .Net Framework. ___ answer5554800 ___

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.

    
___ qstnhdr ___ C # GetHashCode Frage ___
Yippie-Ki-Yay 05.04.2011, 15:53
quelle

3 Antworten

17

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

sein %Vor%

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

ist %Vor%

All dies zusammen macht deutlich, dass Sie das Konzept, das Sie ausprobieren möchten, überdenken müssen und eine andere Definition von Equals finden.

    
jason 05.04.2011, 16:01
quelle
7

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.

    
NerdFury 05.04.2011 15:57
quelle
6

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.

    
Jon 05.04.2011 15:58
quelle