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

时间:2009-06-11 09:58:49

标签: c#

您会认为如果两个字典包含相同的键和值,它们将返回相同的哈希码并且相等吗?但他们没有 - 我做错了什么?或者如何以这种方式比较词典?

感谢。代码下面的代码

/在这种情况下我也想测试顺序是否相同。

     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);

3 个答案:

答案 0 :(得分:4)

如果您想测试集合是否相同,包括它们的排序:

bool areEqual = sd1.SequenceEqual(sd2);

如果您想将集合视为无序集:

bool areEqual =
    (sd1.Count == sd2.Count) && (sd1.Intersect(sd2).Count() == sd1.Count);

(如果需要,SequenceEqualIntersect也可以使用IEqualityComparer参数。)

正如其他几个答案所述,SortedDictionary不会覆盖EqualsGetHashCode的默认实施。 Equals的默认实现将使用引用相等并返回false,因为您正在比较两个单独的对象。

答案 1 :(得分:0)

  

您会认为如果两个字典包含相同的键和值,它们将返回相同的哈希码并且相等吗?

不,这不是Equals和GetHashcode方法的实现方式。它们不被覆盖,因此它是默认的System.Object实现,它只是比较引用。

答案 2 :(得分:0)

您可以查看MSDN以解决此问题:

Equals的默认实现支持引用类型的引用相等性和值类型的按位相等性。引用相等意味着被比较的对象引用引用相同的对象。按位相等意味着被比较的对象具有相同的二进制表示。

因此,由于SortedDictionary包含引用,因此将对它们进行比较。那些明显不同。

您可以在http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

找到更多信息