簡體   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