ambas interfaces parecen comparar objetos por igualdad, entonces, ¿cuáles son las principales diferencias entre ellos?
c#
interface
icomparable
iequatable
SoftwareGeek
fuente
fuente
IComparable
correctamente. Se puede llegar a un ejemplo significativo, dondeCompareTo(…) == 0
no no implica la igualdad? Ciertamente no puedo. De hecho, el contrato de interfaz (según MSDN) requiere que esoCompareTo(…) == 0
implique igualdad. Para decirlo sin rodeos, en un caso como el suyo, use unComparator
objeto especial , no lo implementeIComparable
.IComparable
es totalmente inapropiado aquí. Lo que tiene es un pedido muy particular que solo se aplica en una situación especial. Para tales situaciones, implementar un generalIComparable
está mal. Para esoIComparer
están las s. Por ejemplo, no se puede ordenar a las personas de manera significativa. Pero se pueden ordenar según su salario, la talla de sus zapatos, el número de sus pecas o su peso. Por lo tanto, implementaríamos diferentesIComparer
s para todos estos casos.Como se indica en la página de MSDN para IEquatable :
Equals
vs.CompareTo
fuente
IComparable <T>
define un método de comparación específico de tipo que se puede utilizar para ordenar u ordenar objetos.IEquatable <T>
define un método generalizado que se puede utilizar para implementar para determinar la igualdad.Digamos que tienes clase Person
Para ordenar estos objetos puede utilizar
people.Sort();
.Pero esto arrojará una excepción.
Framework no sabe cómo ordenar estos objetos. Necesita decir cómo ordenar la implementación de la
IComparable
interfaz.Esto ordenará la matriz correctamente con el
Sort()
método.A continuación, para comparar dos objetos puede utilizar el
Equals()
método.Esto regresará
false
porque elEquals
método no sabe cómo comparar dos objetos. Por lo tanto, debe implementar laIEquatable
interfaz y decirle al marco cómo hacer la comparación. Ampliando el ejemplo anterior, se verá así.fuente
IEquatable
utiliza un genérico<Person>
yIComparable
no?