[英]Dictionary class in C# - Equality of two object
我有一個名為Class1的類我覆蓋它的Equals函數現在我有一個Dictionary的實例我添加了一個名為OBJ1的Class1實例。 我有另一個名為OBJ2的Class1實例。 對於OBJ1.Equals(OBJ2),代碼返回true。 但我在字典中找不到OBJ2。
這是偽代碼
Class1 OBJ1 = new Class1(x, y, z);
Class1 OBJ2 = new Class1(a, b, c);
Dictionary<Class1, int> dic1 = new Dictionary<Class1, int>();
dic1.Add(OBJ1, 3);
OBJ1.Equals(OBJ2) -------------> return true
Dictionary.ContainsKey(OBJ2) --------------> return false
為什么會這樣? 任何幫助都會受到高度歡迎
2種可能性:
GetHashCode
尚未正確覆蓋。 您可能想看看為什么在C#中覆蓋Equals方法時重寫GetHashCode很重要? OBJ1
在以影響其哈希碼的方式添加到字典中后已經發生了變異。 在這種情況下,它所放置的桶將不再正確 - ContainsKey
將最終在另一個桶中尋找它。 只要對象在Dictionary中用作鍵,就不能以任何影響其哈希值的方式進行更改。
有可能你沒有以與Equals
一致的方式覆蓋GetHashCode
。
GetHashCode
的契約要求如果OBJ1.Equals(OBJ2)
返回true,則OBJ1.GetHashCode()
必須返回與OBJ2.GetHashCode()
相同的值。
IIRC,如果在不覆蓋GetHashCode()
情況下覆蓋Equals
,則會出現編譯器錯誤(或至少是警告GetHashCode()
。
另一種可能性是你沒有實際overridden
Equals
,但是通過添加新的簽名來重載它,例如
public bool Equals(Class1 other)
一般來說,要提供“自然”價值平等比較,您應該:
IEquatable<T>
您可能沒有覆蓋類中的GetHashcode。 當您重寫Equals時,您也必須覆蓋GetHashcode,否則Dictionary將不適合您。
你也覆蓋了GetHashCode嗎? 你能展示Equals方法的實現嗎?
你是否覆蓋了GetHashCode
?
您還需要覆蓋GetHashCode
,但也不要忘記您可能需要將自定義Comparer傳遞給Dictionary構造函數以及在此SO問題中指出
使某些Class1重寫GetHashCode()。 在比較相等性時,從該方法返回的是第一件事。 默認實現對於每個對象都是唯一的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.