Pregunta

¿Es diferente desde el punto de vista de CLR para aplicar IEqualityComparer vs anulando el operador == de la propiedad que se utilizaría en el IEqualityComparer<T>? Y si es así, cuándo se usa uno contra el otro?

Editar

Ok lo hace tiene sentido que el IEqaulityComparer utilizado por las implementaciones de Hashtable - se deslizó fuera de mi mente cuando estaba publicando la pregunta. Entonces, ¿qué acerca de las extensiones de LINQ de IEnumerable. ¿Quiere decir que .net acumula una tabla hash en la ejecución de ese tipo de métodos de extensión?

¿Fue útil?

Solución

IEqualityComparer no es equal, igual es para el objeto (método de instancia), pero EqualityComparer es para la decoración por ejemplo en LINQ desea hacer distinta específica:

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

y

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

  }

pero igual es para las personas:

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

Se puede hacer cualquier número de decoración por IEqualityComparer pero no se puede hacer esto mediante el método de instancia (se puede escribir personList.Distinct (nueva AnotherComparer), ...)

Otros consejos

IEqualityComparer es utilizada por la Hashtable , NameValueCollection y OrderedDictionary clases con el fin de apoyar una definición personalizada de 'igualdad' para sus tipos. Es por eso que ofrece GetHashCode (), que no tiene mucho que ver con la igualdad por sí .

Si usted no proporciona un IEqualityComparer, las clases mencionadas anteriormente se pondrá por defecto a Object.equals () , que implementa La igualdad de referencia . Un operator == sobrecargado no será llamado en ese contexto.

EDIT: los métodos de extensión de algunos LINQ hecho tomar una IEqualityComparer como un argumento, pero el principio sigue siendo el mismo: si no se especifica este argumento, el método va a terminar la comparación de las referencias, no los valores, y operator == no será llamado.

IEqualityComparer se utiliza por ejemplo para la comparación en Dictionary<TK,TV>.

Es completamente diferente a anulando operador == porque en realidad Dictionary (y, en general, cualquiera que sea su uso IEqualityComparer) no hace ninguna llamada al operador ==.

A lo sumo, se puede comparar "la implementación de IEqualityComparer" vs "anulando métodos GetHashCode y Equals", porque de hecho son dos maneras de conseguir lo mismo (y yo diría que son iguales a mí).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top