代码之家  ›  专栏  ›  技术社区  ›  Mike Q

dictionary.equals()是否有实现?

  •  9
  • Mike Q  · 技术社区  · 15 年前

    我有一本字典,我将它与另一本字典(变量类型为IDictionary)进行比较。执行d1.equals(d2)将生成false。在下面编写我自己的代码会得到正确的结果。两者都是 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;
    }
    
    5 回复  |  直到 8 年前
        1
  •  12
  •   SoftMemes    15 年前

    dictionary.equals()使用来自对象的默认equals,检查两个对象是否是同一引用,以及所有其他默认集合。您可以自由地使用值语义创建自己的子类,尽管这通常也包括不可变的内容。

        2
  •  5
  •   Joren    15 年前

    大概是 Equals 方法 Dictionary 类只使用继承自的默认实现 Object 也就是说,它只是比较 词典 对象引用通过了它自己的引用。请参见这里: Object.Equals reference

        3
  •  2
  •   Lucero    15 年前

    假设两个字典,一个是 SortedList<TKey, TValue> 一个 Dictionary<TKey, TValue> ,进行相等比较,如果项相同,是否真的返回true?那将是非常糟糕的,因为它们有不同的特征和特点 SortedList<,> 例如,允许通过索引检索)。

    同样,相等和哈希代码在逻辑上是绑定在一起的。哈希代码应该是不可变的,否则所有基于哈希的算法都将无法工作。当使用内容检查是否相等时,您不能保证这一点。因此,默认实现(检查它们是否是同一个实例)是相当健全的。不过,您可以自由创建自己的内容平等比较。

        4
  •  1
  •   Yuriy Faktorovich    15 年前

    其他人提到它正在使用object.equals实现,您可以使用以下方法重写它:

    public class EqualsDictionary<T, T> : Dictionary<T, T>
    {
        public override bool Equals(object obj)
        {
            //Place your comparison implementation here
        }
    }
    
        5
  •  0
  •   supercat    11 年前

    .NET中的引用除了封装对象状态的不可变方面之外,还可以用于封装对象的标识、状态的可变方面(两者都有或两者都没有)。通常,如果没有特殊的理由来假设其他情况,.NET假定引用可变对象是为了封装标识。它进一步假定,在代码比较引用而不知道它们代表什么的情况下,最好是错误地报告不平等的情况。因此,如果且仅当两个对可变对象的引用标识相同的对象时,通常认为它们是等效的,因此不鼓励可变类型重写 Equals 指示其他任何事情。相反,使用引用来封装可变状态的代码应该使用除 Object.Equals() 比较一下。