les deux interfaces semblent comparer les objets pour l'égalité, alors quelles sont les différences majeures entre eux?Quelle est la différence entre les interfaces IComparable et IEquatable?
Répondre
IEquatable
vérifie si deux objets sont égaux.
IComparable
impose un ordre total sur les objets comparés.
Par exemple, IEquatable
vous dira que 5 ne soit pas égal à 7. IComparable
vous dira que 5 vient avant 7.
Comme indiqué sur le MSDN Page for IEquatable:
L'interface IComparable définit la méthode
CompareTo
, qui détermine l'ordre de tri des instances du type d'implémentation . L'interface IEquatable définit la méthodeEquals
, qui détermine l'égalité de instances du type d'implémentation.
Equals
contre CompareTo
En plus de la réponse de Greg D':
Vous pouvez mettre en œuvre IComparable sans mettre en œuvre IEquatable pour une classe où un ordre partiel est logique, et où très certainement vous souhaite le consommateur pour tirer l'inférence que juste parce que CompareTo() renvoie zéro, ce ne signifie pas que les objets sont égaux (à des fins autres que le tri).
IEquatable<T>
pour l'égalité.
IComparable<T>
pour la commande.
Cela ressemble beaucoup plus à un comparateur spécial qu'à un objet implémentant 'IComparable' correctement. Pouvez-vous trouver un exemple significatif où 'CompareTo (...) == 0' ** n'implique pas ** l'égalité? Je ne peux certainement pas. En fait, le contrat d'interface (selon MSDN) ** requiert ** que 'CompareTo (...) == 0' implique l'égalité. Pour le dire franchement, dans un cas comme le vôtre, utilisez un objet 'Comparator' spécial, ne * pas * implémenter' IComparable'. –
@Konrad - J'ai indiqué plusieurs avertissements - que le type n'implémente pas IEquatable (donc évidemment, l'expéditeur ne veut pas inclure un test d'égalité), et que les résultats CompareTo sont utilisés pour le tri, * pas * pour évaluer l'égalité . Vous obtenez également des questions sur l'égalité qui est pertinente (référence, valeur, ignorant les attributs "arbitraires" - un livre bleu de 500 pages peut être "égal" à un livre rouge de 500 pages, pour IComparable) –
Votre dernière phrase est fausse, et c'est l'erreur particulière que je voulais souligner: 'IComparable' est totalement inapproprié ici. Ce que vous avez, c'est un ordre très particulier qui ne s'applique qu'à une situation particulière. Pour de telles situations, l'implémentation d'un 'IComparable 'général est incorrecte. C'est ce que 'IComparer's sont là pour. Par exemple, les gens ne peuvent pas être commandés de manière significative. Mais ils peuvent être commandés en fonction de leur salaire, de la taille de leurs chaussures, du nombre de leurs taches de rousseur ou de leur poids. Par conséquent, nous implémenterions différents 'IComparer's pour tous ces cas. –