![](/img/trans.png)
[英]What's the role of GetHashCode in the IEqualityComparer<T> in .NET?
[英]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.9
和1.9 == 2.8
但不是1 == 2.8
。
(你还需要x == x
, x == 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.