2010-03-09 74 views

Répondre

160

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.

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éthode Equals, qui détermine l'égalité de instances du type d'implémentation.

Equals contre CompareTo

10

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).

+9

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'. –

+2

@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) –

+3

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. –

13

IEquatable<T> pour l'égalité.

IComparable<T> pour la commande.