我有我比较另一词典(类型为IDictionary的变量)的字典。 这样做d1.Equals(D2)产生false。 下面写我自己的代码产生true。 两者都是System.Collections.Generic.Dictionary
。 我缺少的东西或不Dictionary
不具有Equals
实现,比较键/值?
private static bool DictEquals<K, V>(IDictionary<K, V> d1, IDictionary<K, V> d2)
{
if (d1.Count != d2.Count)
return false;
foreach (KeyValuePair<K, V> pair in d1)
{
if (!d2.ContainsKey(pair.Key))
return false;
if (!Equals(d2[pair.Key], pair.Value))
return false;
}
return true;
}
Dictionary.Equals()使用默认从Object等,检查是否两个对象是相同的,如同所有其他的默认集合。 你可以自由地创建自己的子类值语义的,尽管这通常包括的东西是一成不变的为好。
大概Equals
的方法Dictionary
类简单地诉诸默认实现从继承的Object
,也就是说,它只是比较Dictionary
有自己的引用传递对象引用。 在这里看到: 的Object.Equals参考
假设两本字典,一个是SortedList<TKey, TValue>
和一个Dictionary<TKey, TValue>
,是实现平等相比,如果真的,如果项目是相同返回true? 这将是非常糟糕的,因为它们具有不同的特性和特征(在SortedList<,>
例如允许检索经由索引)。
此外,平等和哈希码在逻辑上捆绑在一起。 哈希码应该是一成不变的,否则所有的基于散列算法将无法工作。 当你使用的内容来检查平等,你不能保证这一点。 因此,默认的实现(检查是否是相同的实例)是相当明智的。 你可以自由地虽然创建自己的内容相等比较。
也有人提到,它使用的Object.Equals实现,可以使用以下方法来覆盖它:
public class EqualsDictionary<T, T> : Dictionary<T, T>
{
public override bool Equals(object obj)
{
//Place your comparison implementation here
}
}
在.NET引用可以用于封装对象的身份,它的状态的可变方面,两个,或两者都不是,除了封装对象的状态的不可变的方面。 一般而言,在没有特别的理由,否则假定,.NET假定到可变对象的引用被用于包封同一性的目的。 它还假定在代码不知道它们代表什么比较参考的情况下,最好是宁可报告东西不平等的一面。 因此,两次提到可变对象通常被认为相当于当且仅当它们识别相同的对象,从而可变类型都望而却步从压倒一切Equals
指示别的。 相反,它使用引用封装可变状态应该用比其他一些手段代码Object.Equals()
对它们进行比较。