您会认为如果两个字典包含相同的键和值,它们将返回相同的哈希码并且相等吗?但他们没有 - 我做错了什么?或者如何以这种方式比较词典?
感谢。代码下面的代码
/在这种情况下我也想测试顺序是否相同。
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);
答案 0 :(得分:4)
如果您想测试集合是否相同,包括它们的排序:
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
,因为您正在比较两个单独的对象。
答案 1 :(得分:0)
您会认为如果两个字典包含相同的键和值,它们将返回相同的哈希码并且相等吗?
不,这不是Equals和GetHashcode方法的实现方式。它们不被覆盖,因此它是默认的System.Object实现,它只是比较引用。
答案 2 :(得分:0)
您可以查看MSDN以解决此问题:
Equals的默认实现支持引用类型的引用相等性和值类型的按位相等性。引用相等意味着被比较的对象引用引用相同的对象。按位相等意味着被比较的对象具有相同的二进制表示。
因此,由于SortedDictionary包含引用,因此将对它们进行比较。那些明显不同。
找到更多信息