簡體   English   中英

字典(TKey,TValue)GetHashCode和Equals - 它們如何工作?

[英]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);

(如果需要, SequenceEqualIntersect也可以采用IEqualityComparer參數。)

正如其他幾個答案所述, SortedDictionary不會覆蓋EqualsGetHashCode的默認實現。 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.

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