我有我比较到另一个词典(类型为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()对它们进行比较。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top