。NET词典具有相同的键和值,但不是“相等”

问题描述 投票:17回答:6

此测试失败:

using Microsoft.VisualStudio.TestTools.UnitTesting;        

[TestMethod()]
        public void dictEqualTest() {
            IDictionary<string, int> dict = new Dictionary<string, int>();
            IDictionary<string, int> dictClone = new Dictionary<string, int>();

        for (int x = 0; x < 3; x++) {
            dict[x.ToString()] = x;
            dictClone[x.ToString()] = x;
        }

        Assert.AreEqual(dict, dictClone); // fails here
        Assert.IsTrue(dict.Equals(dictClone)); // and here, if the first is commented out
        Assert.AreSame(dict, dictClone); // also fails
    }

我是否对Dictionary的工作方式有误解?

我正在寻找.equals()的Java等效项,而不是尝试检查引用相等性。

c# .net dictionary equality
6个回答
21
投票

字典类未覆盖从MSDN doco中看到的Object.Equals方法:

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

确定是否指定了对象等于当前对象。


10
投票
如果您对如何从单元测试的角度解决此问题特别感兴趣:

尝试一下


7
投票
问题出在这行代码:

Assert.AreEqual(dict, dictClone)


4
投票
我使用了一种扩展方法来检查两个序列是否相等

public static bool CheckForEquality<T>(this IEnumerable<T> source, IEnumerable<T> destination) { if (source.Count() != destination.Count()) { return false; } var dictionary = new Dictionary<T, int>(); foreach (var value in source) { if (!dictionary.ContainsKey(value)) { dictionary[value] = 1; } else { dictionary[value]++; } } foreach (var member in destination) { if (!dictionary.ContainsKey(member)) { return false; } dictionary[member]--; } foreach (var kvp in dictionary) { if (kvp.Value != 0) { return false; } } return true; }


1
投票
您完全不了解引用类型如何工作。

Dictionary不会覆盖object.Equals()。因此,它使用引用相等性-基本上,如果两个引用都指向同一个实例,则它们相等,否则它们就不相等。


0
投票
NUnit类CollectionAssert具有一个AreEquivalent method which accepts IEnumerable as parameters,因此在这种情况下就很简单

AreEquivalent

© www.soinside.com 2019 - 2024. All rights reserved.