繁体   English   中英

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

[英]What would be implementation GetHashCode() for IEqualityComparer<double>

我正在寻找下面的类的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) 不过我正在寻找更实用的东西。 你有什么主意吗?

这甚至在您不必担心GetHashCode之前就打破了IEqualityComparer<>的规范。

对于等式检查,您需要x == y && y == z来暗示x == z但对于您的Equals实现则不然。 例如,如果epsilon为1 ,则您有1 == 1.91.9 == 2.8但不是1 == 2.8

(你还需要x == xx == y来暗示y == x ,但你的相等检查对那些是好的。)

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

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

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

(x.Equals(y)&& 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM