我正在寻找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).不过我正在寻找更实用的东西.你有什么主意吗?
这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,但你的平等检查对那些人来说没问题.)
我担心我对此的回答与此类似:如何针对这种情况实现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.
因此,您不会最终得到正确定义的不同的相等集,并且您无法为这些集分配任何哈希码数.
| 归档时间: |
|
| 查看次数: |
298 次 |
| 最近记录: |