les deux interfaces semblent comparer les objets pour l'égalité, alors quelles sont les principales différences entre eux?
c#
interface
icomparable
iequatable
LogicielGeek
la source
la source
IComparable
correctement. Pouvez-vous proposer un exemple significatif oùCompareTo(…) == 0
n'implique pas l' égalité? Je ne peux certainement pas. En fait, le contrat d'interface (selon MSDN) exige que celaCompareTo(…) == 0
implique l'égalité. Pour le dire franchement, dans un cas comme le vôtre, utilisez unComparator
objet spécial , ne l' implémentez pasIComparable
.IComparable
est totalement inappropriée ici. Ce que vous avez, c'est un ordre très particulier qui ne s'applique que dans une situation particulière. Dans de telles situations, la mise en œuvre d'un généralIComparable
est une erreur. C'est pour ça queIComparer
ça sert . Par exemple, les gens ne peuvent pas être ordonnés de manière significative. Mais ils peuvent être commandés en fonction de leur salaire, de leur pointure, du nombre de leurs taches de rousseur ou de leur poids. Par conséquent, nous implémenterions desIComparer
s différents pour tous ces cas.Comme indiqué sur la page MSDN pour IEquatable :
Equals
contre.CompareTo
la source
IComparable <T>
définit une méthode de comparaison spécifique au type qui peut être utilisée pour ordonner ou trier des objets.IEquatable <T>
définit une méthode généralisée qui peut être utilisée pour implémenter pour déterminer l'égalité.Disons que vous avez la classe Person
Pour trier ces objets, vous pouvez utiliser
people.Sort();
.Mais cela lèvera une exception.
Framework ne sait pas comment trier ces objets. Vous devez dire comment trier l'
IComparable
interface d' implémentation .Cela triera correctement le tableau avec la
Sort()
méthode.À côté de comparer deux objets, vous pouvez utiliser la
Equals()
méthode.Cela reviendra
false
car laEquals
méthode ne sait pas comment comparer deux objets. Par conséquent, vous devez implémenter l'IEquatable
interface et indiquer au framework comment effectuer la comparaison. En prolongeant l'exemple précédent, cela ressemblera à ceci.la source
IEquatable
utilise un générique<Person>
etIComparable
non?