2010-05-21 23 views

Répondre

2

Vous devez passer outre Equals(object obj). Il est toujours attendu que vous implémentez GetHashCode lorsque vous modifiez Equals. Lisez ceci article sur MSDN.

3

Si vous ne passez pas IEqualityComparer<T> dans le constructeur dictionnaire, il utilisera EqualityComparer<T>.Default qui est défini par MSDN comme:

Les contrôles de propriété par défaut si type T implémente le System.IEquatable (de T interface et, le cas échéant, renvoie un EqualityComparer (Of T) que utilise cette implémentation. Dans le cas contraire, il retourne un EqualityComparer (Of T) qui utilise les redéfinitions Object.Equals et Object.GetHashCode fournies par T.

Donc, la mise en œuvre IEquatable<T> serait mon choix (si vous le mettre en œuvre, il est également logique pour remplacer Equals et GetHashCode de toute façon).

+0

Je ne recommanderais pas d'avoir un type héritable implémentable IEquatable , car de mauvaises choses se produiront si un type dérivé substitue Object.Equals (Object) et/ou Object.GetHashCode (Object) et l'implémentation de IEquatable n'appelle pas ces remplacements; puisque lancer vers Object pour appeler ces overrides annulerait tout avantage obtenu en utilisant l'interface générique, il n'y a vraiment aucun intérêt à l'implémenter. – supercat

3

Soit et mettre en œuvre EqualsGetHashCodeou créer un IEqualityComparer<T> approprié qui a la bonne forme d'égalité correspondant à votre carte. J'aime plutôt la route IEqualityComparer<T>: dans la plupart des cas, il n'y a pas une seule forme d'égalité à droite: vous voulez traiter les objets de manière différente selon la situation. Dans ce cas, un comparateur d'égalité personnalisé est exactement ce dont vous avez besoin. Bien sûr, s'il est une opération d'égalité naturelle, il est logique d'implémenter IEquatable<T> dans le type lui-même ... si vous le pouvez. (Un autre avantage de IEqualityComparer<T> est que vous pouvez l'implémenter pour les types sur lesquels vous n'avez aucun contrôle.)