ambas interfaces parecen comparar objetos por igualdad, entonces, ¿cuáles son las principales diferencias entre ellos?
                    
                        c#
                                interface
                                icomparable
                                iequatable
                                
                    
                    
                        SoftwareGeek
fuente
                
                
            fuente

IComparablecorrectamente. Se puede llegar a un ejemplo significativo, dondeCompareTo(…) == 0no no implica la igualdad? Ciertamente no puedo. De hecho, el contrato de interfaz (según MSDN) requiere que esoCompareTo(…) == 0implique igualdad. Para decirlo sin rodeos, en un caso como el suyo, use unComparatorobjeto especial , no lo implementeIComparable.IComparablees 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 generalIComparableestá mal. Para esoIComparerestá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 diferentesIComparers para todos estos casos.Como se indica en la página de MSDN para IEquatable :
Equalsvs.CompareTofuente
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
IComparableinterfaz.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á
falseporque elEqualsmétodo no sabe cómo comparar dos objetos. Por lo tanto, debe implementar laIEquatableinterfaz y decirle al marco cómo hacer la comparación. Ampliando el ejemplo anterior, se verá así.fuente
IEquatableutiliza un genérico<Person>yIComparableno?