![](/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.