2011-05-26 21 views
11

He escrito un montón de objetos que forman parte de colecciones y en los que tendré que hacer muchos tipos de búsqueda y búsqueda. En la mayoría de estos objetos he implementado y anulado el método Equals, IEquatable y operator! y operator==.Lista <T> Ordenar utiliza Comparer <T> en lugar de IEquatable, ¿Por qué?

Ahora llego a querer usar List<T>.Sort en un objeto que ha implementado todo lo anterior y resulta que necesito implementar IComparable para hacer una clasificación personalizada.

¿Por qué Sort utiliza IComparable y cuál es el punto de tener IEquatable en todos mis objetos?

Además, ¿qué tiene que ver la excepción Object.Equal con todo esto?

+1

Experimento de pensamiento; tienes tres enteros, 'a',' b' y 'c'; usted sabe que 'a == b',' a! = c' y 'b! = c' (que son todas las combinaciones disponibles). Ahora: ponga 'a',' b' y 'c' en orden ascendente; p –

Respuesta

14

No es posible utilizar IEquatable<T> para ordenar, saber si dos cosas son iguales no ayuda a clasificarlas. Sin embargo, puede usar IComparable<T> si sus tipos lo implementan, o cualquier IComparer<T> (incluido Comparer<T>.Default) para proporcionar un objeto comparador personalizado. El estilo funcional (Comparison<T>) es conveniente también, por ad-hoc de clasificación sin porciones de código:

list.Sort((x,y) => string.Compare(x.Name, y.Name)); 

pero si lo que desea es un simple ordinal tipo, haga que su T implemento IComparable<T>, y sólo tiene que utilizar:

list.Sort(); 
4

Porque IComparable permite determinar si un objeto es "más pequeño" o "más grande" que otro objeto, mientras que IEquatable ayuda a determinar si dos objetos son "iguales".

El primero es necesario para la clasificación, porque el simple hecho de saber qué objetos tienen el mismo valor no ayuda a ponerlos en un orden específico.

7

La igualdad solo puede darle un resultado de si dos objetos son iguales o no. No puede decirle si x debe aparecer antes o después de y en el orden ordenado. Dado solo la igualdad, ¿cómo propone que List<T> realice cualquier clasificación?

El objetivo de implementar IEquatable<T> es para cuando es igualdad que es importante, p. en HashSet<T> o como el tipo de clave en un Dictionary<TKey, TValue>. Del mismo modo, no se pudieron implementar de manera eficiente usando soloIComparable<T>, ya que no proporcionaría un código hash.

Las dos interfaces se utilizan básicamente en diferentes situaciones.

4

Porque la ordenación depende no solo de la igualdad sino del rango relativo. Para ordenar, necesitas saber la posición de los objetos en relación con los demás. Mayor que, menor que, igual

0

Pues bien, como se puede ver en the other questions about this topic, IEquatable<T> cheques por la igualdad, mientras que IComparable<T> introduce un rango en lo que se necesita para la clasificación.

0

Igualdad le dice si dos instancias son iguales. La comparabilidad te dice cómo ordenarlos.

Sobreescribes la versión de instancia de Object.Equals cuando sabes mejor que el tiempo de ejecución cómo funciona la igualdad para tu tipo.

Igualdad para los tipos de referencia se predetermina a la Igualdad de referencia (la misma referencia es el mismo objeto).

object o1 = new object(); 
object o2 = o1; 

if(o2==o1) 
{ 
    Console.WriteLine("These reference types are equal"); 
} 

object o3 = new object(); 

if(o2 != o3) 
{ 
    Console.WriteLine("These reference types are not equal"); 
} 

La igualdad predeterminada para los tipos de valor significa que todas las variables de miembro son iguales. En general, debe anular Igual para los tipos de valores, porque probablemente sepa mejor lo que significa.

Cómo afecta la comparabilidad es que la comparabilidad de alguna manera se basa en la igualdad. Para saber lo que significa ser menor o mayor que lo que necesita saber lo que significa.

Cuestiones relacionadas