簡體   English   中英

我應該如何實現IEqualityComparer <T> 。等於

[英]How should I implement IEqualityComparer<T>.Equals

關於IEqualityComparer,是否有理由為什么Equals(T x, T y)實現應該是我下面所沒有的?

public class MyEquality : IEqualityComparer<MyType>
{
    //My Equals(T x, T y) always looks like this
    public bool Equals(MyType x, MyType y)
    {
        return this.GetHashCode(x).Equals(this.GetHashCode(y));
    }

    public int GetHashCode(MyType obj)
    {
        //assume MyType has a non-nullable member called ID
        return obj.ID.GetHashCode();
    }
}

是。 哈希碼可能會沖突,實際上,它們會具有多種類型。 它們僅存在以確保哈希表中的值相等分布,它們對確定值的相等性沒有用。 埃里克利珀也有這樣的取值(和另外一個 ):

使用32位哈希碼作為“唯一”標識符是一個非常糟糕的主意。 哈希值本身並不是隨機的,但是如果它們分布合理,那么它們也很可能是我們的目的。 您可能會想:“當然,顯然它們並不是真正唯一的,因為可能的值超過40億,但只有40億的哈希碼可用。 但是散列值太多了,賠率非常好,我將為我的散列獲得唯一的值。” 但是機會真的那么好嗎? 9300個對象並不多,只有1%的對象發生碰撞的可能性很高。

話雖如此,如果您的ID是確定相等性時唯一要注意的事情,那么比較該ID就足夠了。 但不是其哈希碼,因為哈希碼僅表示

a .GetHashCode()≠ b .GetHashCode()→ ab

注意,對於哈希碼相同的情況,沒有任何說明。

是的,有:如果ID的哈希碼現在或將來某個時間不適合int ,當具有相同哈希碼的不相等對象開始評估為相等時,您將感到非常討厭。 如果以后有人決定ID應該是longGuid ,則MyEquality將繼續愉快地進行編譯,但是其行為將是無法避免的錯誤。

無關緊要的是,如果MyType是一個類,則可能需要采取一些措施來防止xynull時崩潰:盡管IEqualityComparer<T>的協定沒有明確要求它(與object.Equals一樣)在IEqualityComparer<T>.Equals處理null是一個好主意。在您搜索可能包含null對象的容器時,該情況均IEqualityComparer<T>.Equals

當然。 在一個對象中,您只關心一個或多個屬性是相同的,就可以認為它們對於您的目的是相等的。

如果要比較列表list1和List list2,如果它們具有一些“公共”元素,例如list1 = {“ apparent”,“ obvious”}和list2 = {“ aPPARENT”,“ oBVIOUS”}

如果您對權益的定義如下:

  • 第一個字符必須相等,區分大小寫
  • 其余字符不能相等(區分大小寫)

您必須在IEqualityComparer中定義自己的邏輯。

此外,在LINQ中,所有Where,Any,Except,Intersect等子句都可能需要附加的IEqualityComparer對象,以掛鈎自定義邏輯。

暫無
暫無

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

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