ambas as interfaces parecem comparar objetos por igualdade, então quais são as principais diferenças entre elas?
c#
interface
icomparable
iequatable
SoftwareGeek
fonte
fonte
IComparable
corretamente. Você pode dar um exemplo significativo emCompareTo(…) == 0
que não implique igualdade? Certamente não posso. Na verdade, o contrato de interface (conforme MSDN) exige queCompareTo(…) == 0
implique igualdade. Para ser franco, em um caso como o seu, use umComparator
objeto especial , não implementeIComparable
.IComparable
é totalmente inapropriado aqui. O que você tem é uma ordem muito particular que se aplica apenas a uma situação especial. Para tais situações, implementar um generalIComparable
é errado. É para isso queIComparer
existem. Por exemplo, as pessoas não podem ser ordenadas de forma significativa. Mas podem ser encomendados de acordo com o salário, o tamanho do sapato, a quantidade de sardas ou o peso. Portanto, implementaríamosIComparer
s diferentes para todos esses casos.Conforme declarado na Página do MSDN para IEquatable :
Equals
vs.CompareTo
fonte
IComparable <T>
define um método de comparação específico de tipo que pode ser usado para ordenar ou classificar objetos.IEquatable <T>
define um método generalizado que pode ser usado para implementar para determinar a igualdade.Digamos que você tenha uma classe Person
Para classificar esses objetos, você pode usar
people.Sort();
.Mas isso lançará uma exceção.
O Framework não sabe como classificar esses objetos. Você precisa dizer como classificar a
IComparable
interface de implementação .Isso classificará a matriz corretamente com o
Sort()
método.Em seguida, para comparar dois objetos, você pode usar o
Equals()
método.Isso retornará
false
porque oEquals
método não sabe como comparar dois objetos. Portanto, você precisa implementar aIEquatable
interface e dizer ao framework como fazer a comparação. Estendendo o exemplo anterior, ficará assim.fonte
IEquatable
usa um genérico<Person>
eIComparable
não?