2010-03-09 12 views

Respuesta

160

IEquatable prueba si dos objetos son iguales.

IComparable impone un total de pedidos en los objetos que se comparan.

Por ejemplo, IEquatable le diría que 5 no es igual a 7. IComparable le dirá que viene antes de 5 7.

7

Como se indica en la MSDN Page for IEquatable:

La interfaz IComparable define el método CompareTo, que determina el orden de las instancias del tipo de implementación . La interfaz IEtabletable define el método Equals, que determina la igualdad de las instancias del tipo de implementación.

Equals vs CompareTo

10

Además de Greg D's respuesta:

Es posible aplicar IComparable sin implementar IEquatable para una clase donde un orden parcial tiene sentido, y donde definitivamente desea el consumidor para deducir que solo porque CompareTo() devuelve cero, no implica que los objetos son iguales (para nada que no sea la clasificación).

+9

Suena mucho más como un comparador de casos especiales que como un objeto que implementa 'IComparable' correctamente. ¿Puedes dar con un ejemplo significativo donde 'CompareTo (...) == 0' no ** implica ** igualdad? Ciertamente no puedo. De hecho, el contrato de interfaz (según MSDN) ** requiere ** que 'CompareTo (...) == 0' implica igualdad. Para decirlo sin rodeos, en un caso como el suyo, use un objeto 'Comparator' especial, no * implemente' IComparable'. –

+2

@Konrad - Indiqué varias advertencias: que el tipo no implementa IEquatable (así que, obviamente, el autor no desea incluir una prueba de igualdad), y que los resultados de CompareTo se usan para ordenar, * no * para evaluar la igualdad . También se aborda la cuestión de qué igualdad es relevante (referencia, valor, ignorando los atributos "arbitrarios": un libro azul de 500 páginas de longitud puede ser "igual" a un libro rojo de 500 páginas de longitud, a los efectos de IComparable) –

+3

Su última frase es incorrecta, y este es el error particular que quería señalar: 'IComparable' es completamente inapropiado aquí. Lo que tienes es un pedido muy * particular * que solo se aplica en una situación especial. Para tales situaciones, implementar un 'IComparable' general es incorrecto. Esto es para lo que 'IComparer's está ahí. Por ejemplo, las personas no pueden ser ordenadas de manera significativa. Pero * pueden * ordenarse según su salario, el tamaño de su zapato, el número de sus pecas o su peso. Por lo tanto, implementaríamos diferentes 'IComparer's para todos estos casos. –

13

IEquatable<T> para la igualdad.

IComparable<T> para pedir.

Cuestiones relacionadas