2014-09-15 1 views
4

Je cherche une implémentation simple de la méthode GetHashCode() pour la classe suivante.Quelle serait l'implémentation GetHashCode() pour IEqualityComparer <double>

public class EpsilonEqualityComparer : IEqualityComparer<double> 
{ 
    private readonly double _epsilon; 
    public EpsilonEqualityComparer(double epsilon) 
    { 
     _epsilon = epsilon; 
    } 

    public bool Equals(double x, double y) 
    { 
     return Math.Abs(x - y) < _epsilon; 
    } 

    public int GetHashCode(double obj) 
    { 
     ... 
    } 
} 

Bien sûr implémentation triviale serait quelque chose comme return Math.Sign(obj). Néanmoins, je cherche quelque chose de plus pratique. Avez-vous une idée?

+1

Cela peut ne pas être facile. 'GetHashCode()' est censé agir de manière cohérente avec 'Equals()'. Si votre 'Equals()' se compare à epsilon, alors deux doubles qui comparent égal à epsilon * doivent * avoir le même code de hachage. –

Répondre

7

Cela casse la spécification de IEqualityComparer<> même avant que vous ayez à vous soucier de GetHashCode.

Pour une vérification d'égalité, vous avez besoin de x == y && y == z pour impliquer x == z mais ce n'est pas le cas pour votre implémentation Equals. Par exemple, avec un epsilon de 1, vous avez 1 == 1.9 et 1.9 == 2.8 mais pas 1 == 2.8.

(. Vous avez également besoin x == x et x == y impliquer y == x, mais votre chèque à l'égalité est bien avec ceux)

6

Je suis peur que ma réponse à cette question sera analogue, à ceci: How to implement GetHashCode for this situation?

Cependant, dans votre cas, la situation n'est pas si évidente. Il semble que vous ayez une condition d'égalité correctement définie, mais ce n'est peut-être pas le cas.

Dans l'autre réponse que je parlais à MSDN indiquant:

(x.Equals (y) & & y.Equals (z)) renvoie true si et seulement si x.Equals (z) renvoie true .

Maintenant, supposons que vous avez trois numéros:

x = anything 
y = x + epsilon 
z = y + epsilon // == x + 2 * epsilon 

Puis x.Equals(y) et y.Equals(z) mais x ne correspond pas à z. A cause de cela, vous ne finirez pas avec des ensembles d'égalité distincts correctement définis, et vous ne pouvez pas attribuer à ces ensembles de nombres de codes de hachage.

+0

Dommage que je ne peux pas accepter deux réponses. En tout cas merci les gars. –

Questions connexes