簡體   English   中英

C#中的字典類 - 兩個對象的等價

[英]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種可能性:

  1. GetHashCode尚未正確覆蓋。 您可能想看看為什么在C#中覆蓋Equals方法時重寫GetHashCode很重要?
  2. OBJ1在以影響其哈希碼的方式添加到字典中后已經發生了變異。 在這種情況下,它所放置的桶將不再正確 - ContainsKey將最終在另一個桶中尋找它。

來自Dictionary<TKey, TValue>

只要對象在Dictionary中用作鍵,就不能以任何影響其哈希值的方式進行更改。

有可能你沒有以與Equals一致的方式覆蓋GetHashCode

GetHashCode的契約要求如果OBJ1.Equals(OBJ2)返回true,則OBJ1.GetHashCode()必須返回與OBJ2.GetHashCode()相同的值。

IIRC,如果在不覆蓋GetHashCode()情況下覆蓋Equals ,則會出現編譯器錯誤(或至少是警告GetHashCode()

另一種可能性是你沒有實際overridden Equals ,但是通過添加新的簽名來重載它,例如

public bool Equals(Class1 other)

一般來說,要提供“自然”價值平等比較,您應該:

  • 覆蓋等於(對象)
  • 覆蓋GetHashCode
  • 強烈考慮實現IEquatable<T>
  • 考慮重載==和!=

您可能沒有覆蓋類中的GetHashcode。 當您重寫Equals時,您也必須覆蓋GetHashcode,否則Dictionary將不適合您。

你也覆蓋了GetHashCode嗎? 你能展示Equals方法的實現嗎?

你是否覆蓋了GetHashCode

您還需要覆蓋GetHashCode ,但也不要忘記您可能需要將自定義Comparer傳遞給Dictionary構造函數以及在此SO問題中指出

使某些Class1重寫GetHashCode()。 在比較相等性時,從該方法返回的是第一件事。 默認實現對於每個對象都是唯一的。

暫無
暫無

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

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