Warum hat IEqualityComparerT die Methode GetHashCode ()?

8

IEqualityComparer im Namespace System.Collections.Generic hat folgende Methoden:

%Vor%

Da diese Schnittstelle zur Überprüfung der Gleichheit von Objekten verwendet wird, ist die erste Methode Equals sinnvoll. Aber warum müssen wir auch GetHashCode implementieren? Warum existiert es überhaupt in der Schnittstelle? Wann ist es nötig und warum?

Ich verwende es mit der Methode Enumerable.Distinct () im Namespace System.Linq , und ich bin überrascht zu sehen, dass sogar GetHashCode() zusammen mit Equals() aufgerufen wird. Warum? Wie funktioniert Distinct ?

    
Nawaz 24.02.2011, 12:33
quelle

4 Antworten

8

Details zur Funktionsweise von Distinct (oder zumindest eine einfache Beispielimplementierung) finden Sie in meiner Edulinq-Blogbeitrag dazu ( alt - 404 ).

Um es einfach auszudrücken, ein Hash-Code, der dem entsprechenden Gleichheitsvergleich entspricht, macht es billiger, einen Satz von Elementen zu erstellen. Das ist nützlich in einer Menge von Situationen - wie Distinct , Except , Intersect , Union , Join , GroupJoin , GroupBy , ToLookup und so an.

    
Jon Skeet 24.02.2011, 12:37
quelle
1

GetHashCode wird in HashTables , Dictionaries und anderen verwendet, um die Suche zu optimieren. Schauen Sie hier: Ссылка

    
Daniel Hilgarth 24.02.2011 12:35
quelle
0

Weil die Richtlinien zum Überschreiben von Equals () und Operator == (C # -Programmierhandbuch) sagt:

  

Es wird empfohlen, dass jede Klasse, die Equals überschreibt, auch Object.GetHashCode überschreibt.

Dies liegt daran, dass Hashtabellen usw. erwarten, dass zwei Objekte, die gleich sind, denselben Hashcode haben.

    
Albin Sunnanbo 24.02.2011 12:38
quelle
0

Der Zweck IEqualityComparer (Of T) ist der Verwendung eines Vergleichsverfahrens zu ermöglichen, die von dem Standard Object.Equals semantisch verschieden ist - eine, die zwei Objekte verursachen kann gleich betrachtet werden, auch wenn sich in Betracht ziehen würde Object.Equals anders. Denn gleich Objekte muss gleich Hash-Codes haben, und da Dinge, die die EqualityComparer der Equals Methode berücksichtigt gleich aber Object.Equals hält ungleich haben könnten verschiedene Hash-Codes, ist es notwendig, für die die EqualityComparer einen anderen Hash zu verwenden -Kodierungsmethode.

Eine interessantere Situation besteht bei IEquatable (Of T). Es wird erwartet, dass zwei Objekte niemals als gleich gemeldet werden, wenn sie von Object.Equals ungleich gemeldet werden. Für jede nicht versiegelte Klasse, die IEquatable (Of T) implementiert, ist gefährlich; Schade, es gibt keine generische Einschränkung, die die Verwendung von nicht versiegelten Klassen verbieten würde.

    
supercat 24.02.2011 16:02
quelle