IEqualityComparer im Namespace System.Collections.Generic
hat folgende Methoden:
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
?
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.
GetHashCode
wird in HashTables
, Dictionaries
und anderen verwendet, um die Suche zu optimieren. Schauen Sie hier: Ссылка
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.
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.
Tags und Links c# linq ienumerable iequalitycomparer