簡體   English   中英

利用IEqualityComparer的GetHashCode()部分 <T> 直接比較?

[英]Utilizing the GetHashCode() part of IEqualityComparer<T> for direct comparisons?

我編寫了一個派生自IEqualityComparer<T> ,它非常適合我需要它的LINQ查詢。

據我了解,首先調用GetHashCode() (fast),然后調用Equals() (稍慢),如果hashcode相同,則進行此類操作。

然而,當手動使用它進行直接比較時,我正在使用類似的東西

return new MyIEqualityComparer().Equals(objA,objB);

放棄了更快的GetHashCode()相等性檢查。 有沒有辦法比較objAobjB ,它不會自動跳過更快的GetHashCode()檢查?

我想我希望objA.Equals()有一個重載接受從IEqualityComparer<T>派生的參數。

計算哈希碼並比較哈希值通常比直接比較哈希值要慢。 這是額外的工作。

哈希代碼用於支持哈希表的O(1)行為。 它們將對象映射到哈希表工作所需的數字。 哈希碼對單純的比較沒有幫助。

只需使用Equals

如果你想知道如何最好地實現你的想法(雖然這不是一個好主意)我會使用一個幫助方法:

static bool ExperimentalEquals<T>(T a, T b, IEqualityComparer<T> c) {
 if (c.GetHashCode(a) != c.GetHashCode(b)) return false;
 return c.Equals(a, b);
}

(僅用於教育目的。)

您可能認為在緩存哈希代碼的情況下,這實際上可能更快。 但是Equals可以利用緩存的哈希代碼本身並將比較短路。

目前還不清楚你在做什么,但你總是可以實現IEquatable<T>並委托給MyIEqualityComparer ,因此使用更快的GetHashCode()

class My : IEquatable<My>
{
    public bool Equals(My other)
    {
        return new MyIEqualityComparer().Equals(this, other);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM