我正在寻找以下类的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)
。不过我正在寻找更实用的东西。你有什么想法吗?
答案 0 :(得分:7)
即使您不必担心IEqualityComparer<>
,也会违反GetHashCode
的规范。
对于同等性检查,您需要x == y && y == z
来暗示x == z
,但这不适用于您的Equals
实施。例如,如果epsil为1
,则您有1 == 1.9
和1.9 == 2.8
但不是1 == 2.8
。
(您还需要x == x
和x == 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
。
因此,您不会最终得到正确定义的不同的相等集,并且您无法为这些集分配任何哈希码编号。