![](/img/trans.png)
[英]Should I implement non-generic GetHashCode and Equals if my class implements 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()→ a ≠ b
注意,對於哈希碼相同的情況,沒有任何說明。
是的,有:如果ID
的哈希碼現在或將來某個時間不適合int
,當具有相同哈希碼的不相等對象開始評估為相等時,您將感到非常討厭。 如果以后有人決定ID
應該是long
或Guid
,則MyEquality
將繼續愉快地進行編譯,但是其行為將是無法避免的錯誤。
無關緊要的是,如果MyType
是一個類,則可能需要采取一些措施來防止x
或y
為null
時崩潰:盡管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.