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

Jak*_*urc 4 .net c# 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)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Raw*_*ing 7

IEqualityComparer<>甚至在您不必担心之前就会破坏规范GetHashCode.

对于相等性检查,您需要x == y && y == z暗示,x == z但这不适用于您的Equals实现.例如,有了epsilon 1,你有1 == 1.9,1.9 == 2.8但没有1 == 2.8.

(你也需要x == x,并x == y暗示y == x,但你的平等检查对那些人来说没问题.)


chi*_*oro 6

我担心我对此的回答与此类似:如何针对这种情况实现GetHashCode?

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

在另一个答案中我提到MSDN说:

(x.Equals(y)&& y.Equals(z))当且仅当x.Equals(z)返回true时才返回true.

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

x = anything
y = x + epsilon
z = y + epsilon // == x + 2 * epsilon
Run Code Online (Sandbox Code Playgroud)

然后x.Equals(y),y.Equals(z)x不相等z.

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