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?

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top