![](/img/trans.png)
[英]Will Dictionary<TKey, TValue> use TKey.Equals and TKey.GetHashCode?
[英]Dictionary(TKey, TValue) GetHashCode and Equals - How do they work?
您會認為如果兩個字典包含相同的鍵和值,它們將返回相同的哈希碼並且相等嗎? 但他們沒有 - 我做錯了什么? 或者我如何以這種方式比較字典?
謝謝。 代碼如下
/在這種情況下我也想測試順序是相同/相等的。
SortedDictionary<int,string> sd1 = new SortedDictionary<int,string>();
sd1.Add(1,"one");
sd1.Add(2, "two");
sd1.Add(5, "five");
int sd1Hash = sd1.GetHashCode();
SortedDictionary<int, string> sd2 = new SortedDictionary<int, string>();
sd2.Add(1, "one");
sd2.Add(2, "two");
sd2.Add(5, "five");
int sd2Hash = sd2.GetHashCode();
//This is false
bool areEqual = sd1.Equals(sd2);
如果要測試集合是否相等,包括它們的排序:
bool areEqual = sd1.SequenceEqual(sd2);
如果要將集合視為無序集:
bool areEqual =
(sd1.Count == sd2.Count) && (sd1.Intersect(sd2).Count() == sd1.Count);
(如果需要, SequenceEqual
和Intersect
也可以采用IEqualityComparer
參數。)
正如其他幾個答案所述, SortedDictionary
不會覆蓋Equals
或GetHashCode
的默認實現。 Equals
的默認實現將使用引用相等並返回false
因為您正在比較兩個單獨的對象。
您會認為如果兩個字典包含相同的鍵和值,它們將返回相同的哈希碼並且相等嗎?
不,這不是Equals和GetHashcode方法的實現方式。 它們不會被覆蓋,因此它是默認的System.Object實現,它只是比較引用。
您可以查看MSDN以解決此問題:
Equals的默認實現支持引用類型的引用相等,以及值類型的按位相等。 引用相等意味着被比較的對象引用引用相同的對象。 按位相等意味着被比較的對象具有相同的二進制表示。
因此,由於SortedDictionary包含引用,因此將對它們進行比較。 那些明顯不同。
你可以在http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx找到更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.