Objektvergleich in .net
-
12-10-2019 - |
Frage
Ist es anders aus dem CLR Standpunkt IEqualityComparer
vs Überschreiben des ==
Operators für die Eigenschaft implementieren Sie in der IEqualityComparer<T>
verwenden würden? Und wenn ja, wann würden Sie eine gegen die andere?
Bearbeiten
Ok Ist es sinnvoll, dass die IEqaulityComparer von den Implementierungen von Hashtable verwendet - es rutschte aus meinem Kopf, wenn ich die Frage aufhängte. Also was ist mit den Erweiterungen von Linq von IEnumerable. Heißt das, dass .net eine Hashtable aufbaut, wenn diese Art von Erweiterungsmethoden ausführen?
Lösung
IEqualityComparer
ist nicht equal
, ist gleich für Objekt (Instanz-Methode), aber EqualityComparer ist für die Dekoration zum Beispiel in Linq Sie tun spezifisch verschiedene:
personList.OrderBy(p=>p.ID).Distinct(new MyEqualityComparer())
und
class MyEqualityComparer: IEqualityComparer<Person>
{
public bool Equals(Person p1, Person p2)
{
if (p1.Age == p2.Age)
return true;
return false;
}
public int GetHashCode(Person p)
{
return p.Id.GetHashCode();
}
}
aber gleich für Person:
public class Person
{
public int ID{get;set;}
public int Age{get;set;}
public override bool Equals(object o)
{
//do stuff
}
}
Sie können von IEqualityComparer einer beliebigen Anzahl von Dekoration tun, aber Sie können tun dies nicht durch Instanz-Methode (Sie personList.Distinct schreiben können (neuer AnotherComparer), ...)
Andere Tipps
IEqualityComparer wird durch die Hashtable , Namevaluecollection und GetHashCode () , die hat nicht viel mit Gleichheit zu tun per se .
Wenn Sie keine IEqualityComparer
bieten die genannten Klassen oben wird standardmäßig auf Object.Equals () , die Arbeitsgeräte Referenz Gleichheit . Ein überladenes operator ==
wird nicht in diesem Zusammenhang genannt werden.
EDIT: Einige Erweiterung LINQ Methoden nehmen in der Tat eine IEqualityComparer
als Argument, aber das Prinzip bleibt das gleiche: Wenn dieses Argument nicht angegeben wird, wird das Verfahren Referenzen am Ende verglichen wird, nicht Werte, und operator ==
wird nicht aufgerufen werden.
IEqualityComparer
wird zum Beispiel für den Vergleich in Dictionary<TK,TV>
verwendet.
Es ist völlig anders als zwingender ==
Operator, weil tatsächlich Dictionary
(und im Allgemeinen welchen Gebrauch IEqualityComparer
) keinen Aufruf ==
Operator machen.
Bei den meisten können Sie „Umsetzung IEqualityComparer
“ vs „zwingende GetHashCode
und Equals
Methoden“ vergleichen, denn in der Tat, sie sind zwei Möglichkeiten, um die gleiche Sache zu bekommen (und ich würde sagen, sie sind gleich mir).