是否Dictionary.Equals()有一个实现?(Does Dictionary.Equals

2019-09-02 15:37发布

我有我比较另一词典(类型为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;
}

Answer 1:

Dictionary.Equals()使用默认从Object等,检查是否两个对象是相同的,如同所有其他的默认集合。 你可以自由地创建自己的子类值语义的,尽管这通常包括的东西是一成不变的为好。



Answer 2:

大概Equals的方法Dictionary类简单地诉诸默认实现从继承的Object ,也就是说,它只是比较Dictionary有自己的引用传递对象引用。 在这里看到: 的Object.Equals参考



Answer 3:

假设两本字典,一个是SortedList<TKey, TValue>和一个Dictionary<TKey, TValue> ,是实现平等相比,如果真的,如果项目是相同返回true? 这将是非常糟糕的,因为它们具有不同的特性和特征(在SortedList<,>例如允许检索经由索引)。

此外,平等和哈希码在逻辑上捆绑在一起。 哈希码应该是一成不变的,否则所有的基于散列算法将无法工作。 当你使用的内容来检查平等,你不能保证这一点。 因此,默认的实现(检查是否是相同的实例)是相当明智的。 你可以自由地虽然创建自己的内容相等比较。



Answer 4:

也有人提到,它使用的Object.Equals实现,可以使用以下方法来覆盖它:

public class EqualsDictionary<T, T> : Dictionary<T, T>
{
    public override bool Equals(object obj)
    {
        //Place your comparison implementation here
    }
}


Answer 5:

在.NET引用可以用于封装对象的身份,它的状态的可变方面,两个,或两者都不是,除了封装对象的状态的不可变的方面。 一般而言,在没有特别的理由,否则假定,.NET假定到可变对象的引用被用于包封同一性的目的。 它还假定在代码不知道它们代表什么比较参考的情况下,最好是宁可报告东西不平等的一面。 因此,两次提到可变对象通常被认为相当于当且仅当它们识别相同的对象,从而可变类型都望而却步从压倒一切Equals指示别的。 相反,它使用引用封装可变状态应该用比其他一些手段代码Object.Equals()对它们进行比较。



文章来源: Does Dictionary.Equals() have an implementation?