ambas interfaces parecen comparar objetos por igualdad, entonces, ¿cuáles son las principales diferencias entre ellos?¿Cuál es la diferencia entre las interfaces IComparable e IEquatable?
Respuesta
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.
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étodoEquals
, que determina la igualdad de las instancias del tipo de implementación.
Equals
vs CompareTo
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).
IEquatable<T>
para la igualdad.
IComparable<T>
para pedir.
- 1. ¿Cuál es la diferencia entre IEquatable y simplemente anulando Object.Equals()?
- 2. La diferencia entre las interfaces Ejecutable e Invocable en Java
- 3. ¿Cuál es la diferencia entre IEqualityComparer <T> e IEquatable <T>?
- 4. Localización e internacionalización, ¿cuál es la diferencia?
- 5. ¿Cuál es la diferencia entre IEnumerator e IEnumerable?
- 6. Cuál es la diferencia entre __construct() e init()
- 7. ¿Cuál es la diferencia entre NHibernate e iBATIS.NET?
- 8. ¿Cuál es la diferencia entre IDelegateEvent e IEvent en F #?
- 9. Cuál es la diferencia entre IQueryable e IEnumerable
- 10. ¿Cuál es la diferencia entre una clave principal e identidad?
- 11. ¿cuál es la diferencia entre invalidateList e invalidateDisplayList?
- 12. ¿Cuál es la diferencia entre IDREF e IDREFS en XSD?
- 13. ¿Cuál es la diferencia entre Scope_Identity(), Identity(), @@ Identity e Ident_Current()?
- 14. ¿Cuál es la diferencia entre WAS e IIS?
- 15. ¿Cuál es la diferencia entre identidad e igualdad en OOP?
- 16. ¿Cuál es la diferencia entre "protegido" e "interno protegido"?
- 17. Cuál es la diferencia entre Add-PsSnapIn e Import-Module
- 18. Erlang: ¿cuál es la diferencia entre "include_lib" e "include"?
- 19. ¿Cuál es la diferencia entre objeto e instancia?
- 20. ¿Cuál es la diferencia entre "privado" e "interno protegido"?
- 21. ¿Cuál es la diferencia entre import java.util. *; e importar java.util.Date; ?
- 22. ¿Cuál es la diferencia entre Tarea e hilo?
- 23. ¿Cuál es la diferencia entre ObservableCollection e INotifyPropertyChanged?
- 24. ¿Cuál es la diferencia entre size_t e int en C++?
- 25. ¿Cuál es la diferencia entre mutable e inmutable?
- 26. Cuál es la diferencia entre 'índice' e 'índice de lista'
- 27. ¿Cuál es la diferencia entre Convert.Int32() e Int32.Parse()?
- 28. ¿Cuál es la diferencia entre AxInterop e Interop?
- 29. ¿cuál es la diferencia entre IVT e IDT?
- 30. ¿Cuál es la diferencia entre require e include con php?
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'. –
@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) –
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. –