此测试失败:
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等效项,而不是尝试检查引用相等性。
字典类未覆盖从MSDN doco中看到的Object.Equals
方法:
http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx
确定是否指定了对象等于当前对象。
尝试一下
Assert.AreEqual(dict, dictClone)
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;
}
Dictionary
不会覆盖object.Equals()
。因此,它使用引用相等性-基本上,如果两个引用都指向同一个实例,则它们相等,否则它们就不相等。
CollectionAssert
具有一个AreEquivalent
method which accepts IEnumerable
as parameters,因此在这种情况下就很简单AreEquivalent