IEqualityComparer <double> </double>的实现GetHashCode()是什么

时间:2014-09-15 10:34:57

标签: c# .net hashcode

我正在寻找以下类的GetHashCode()方法的简单实现。

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

当然,琐碎的实现就像return Math.Sign(obj)。不过我正在寻找更实用的东西。你有什么想法吗?

2 个答案:

答案 0 :(得分:7)

即使您不必担心IEqualityComparer<>,也会违反GetHashCode的规范。

对于同等性检查,您需要x == y && y == z来暗示x == z,但这不适用于您的Equals实施。例如,如果epsil为1,则您有1 == 1.91.9 == 2.8但不是1 == 2.8

(您还需要x == xx == y来暗示y == x,但您的平等检查可以正常使用。)

答案 1 :(得分:6)

我担心我对此的回答与此类似:How to implement GetHashCode for this situation?

但是在你的情况下,情况并不那么明显。看起来你有一个正确定义的相等条件,但它可能不是。

在另一个答案中,我提到了MSDN声明:

  

(x.Equals(y)&amp;&amp; y.Equals(z))当且仅当x.Equals(z)返回true时返回true。

现在,假设您有三个数字:

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

然后x.Equals(y)y.Equals(z)x不等于z

因此,您不会最终得到正确定义的不同的相等集,并且您无法为这些集分配任何哈希码编号。