Question

est-il différent du point de vue CLR pour mettre en œuvre IEqualityComparer vs remplaçant l'opérateur == pour la propriété que vous utiliserez dans le IEqualityComparer<T>? Et si oui, quand utiliseriez-vous un contre l'autre?

Modifier

Ok il ne du sens que le IEqaulityComparer utilisé par les implémentations de Hashtable - il a glissé hors de mon esprit quand je postais la question. Alors, que sur les extensions de Linq de IEnumerable. Est-ce que cela veut dire que .net édifie un Hashtable lors de l'exécution de ce genre de méthodes d'extension?

Était-ce utile?

La solution

IEqualityComparer n'est pas equal, égale est pour objet (par exemple méthode), mais EqualityComparer est pour la décoration par exemple dans LINQ vous voulez faire distincte spécifique:

personList.OrderBy(p=>p.ID).Distinct(new MyEqualityComparer())

et

  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();
    }

  }

mais égal est pour la personne:

public class Person
{
 public int ID{get;set;}
 public int Age{get;set;}
 public override bool Equals(object o)
 {
   //do stuff
 }
}

vous pouvez faire un certain nombre de décoration par IEqualityComparer mais vous ne pouvez pas le faire par la méthode d'instance (vous pouvez écrire personList.Distinct (nouveau AnotherComparer), ...)

Autres conseils

IEqualityComparer est utilisé par le Hashtable , NameValueCollection et GetHashCode () , qui n'a pas grand-chose à voir avec l'égalité en soi .

Si vous ne fournissez pas IEqualityComparer, les classes mentionnées ci-dessus par défaut Object.Equals () , qui met en œuvre l'égalité de référence . Un operator == surchargé ne sera pas appelé dans ce contexte.

EDIT: Certaines méthodes d'extension de LINQ prendre en effet un IEqualityComparer comme argument, mais le principe reste le même: si cet argument n'est pas spécifié, la méthode va finir par comparer les références et non des valeurs, et operator == ne sera pas appelé.

IEqualityComparer est utilisé par exemple pour comparaison Dictionary<TK,TV>.

Il est tout à fait différent de remplaçant opérateur == parce qu'en fait Dictionary (et en général tout usage IEqualityComparer) ne fait pas appel à l'opérateur ==.

Au plus, vous pouvez comparer « la mise en œuvre IEqualityComparer » vs « remplaçant GetHashCode et méthodes Equals », parce qu'en effet ils sont deux façons d'obtenir la même chose (et je leur dire que vous êtes égal à moi).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top