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.
- 1. C# -IComparable <T> et IEquatable <T>
- 2. Quelle est la différence entre dict() et {}?
- 3. Quelle est la différence entre "$^N" et "$ +"?
- 4. Quelle est la différence entre = et: =
- 5. quelle est la différence entre:.! et: r !?
- 6. Quelle est la différence entre ~ et! opérateur?
- 7. Quelle est la différence entre les compléments et les macros?
- 8. Quelle est la différence entre les schémas W3 et xmlsoap.org?
- 9. Quelle est la différence entre les événements Control.Enter et Control.GotFocus?
- 10. Quelle est la différence entre les tâches AntCall et Ant?
- 11. Quelle est la différence entre les méthodes GET et POST?
- 12. Quelle est la différence entre les spécifications JPA et JDO?
- 13. Quelle est la différence entre les objets Session et Application?
- 14. Quelle est la différence entre les schémas « :: » et « sys »?
- 15. Quelle est la différence entre les JNDI LDAP et FileSystem?
- 16. Quelle est la différence entre les fonctions NtFsControlFile() et DeviceIoControl()?
- 17. Quelle est la différence entre les paquets android.opengl et javax.microedition.khronos.opengles?
- 18. Quelle est la différence entre les fichiers .lib et .a?
- 19. Quelle est la différence entre la saturation et la luminosité?
- 20. Quelle est la différence entre ces importations?
- 21. Quelle est la différence entre le tuyau et la douille?
- 22. Quelle est la différence entre ces extraits?
- 23. Quelle est la différence entre ces codes?
- 24. Quelle est la différence entre applicationDidReceiveMemoryWarning, didReceiveMemoryWarning?
- 25. Quelle est la différence entre ces commentaires
- 26. Quelle est la différence entre la sérialisation et l'encodage?
- 27. Quelle est la différence entre la version et l'itération?
- 28. Quelle est la différence entre la programmation parallèle et multicœur?
- 29. Quelle est la différence entre la plate-forme et l'outil?
- 30. Différence entre implémentation implicite et explicite des interfaces C#
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. –