代码之家  ›  专栏  ›  技术社区  ›  anthony

使用IEquatable的同级类的C字典唯一性<T>

  •  2
  • anthony  · 技术社区  · 16 年前

    我想将两个类的实例存储在一个字典结构中,并使用IEquatable来确定这些实例的唯一性。这两个类共享一个(抽象)基类。考虑以下类别:

    abstract class Foo
    {
       ...
    }
    
    class SubFoo1 : Foo
    {
       ...
    }
    
    class SubFoo2 : Foo
    {
       ...
    }
    

    Dictionary<Foo, Bar>

    哪些类应该声明为IEquatable?对于这些声明,泛型类型T应该是什么?这有可能吗?

    5 回复  |  直到 16 年前
        1
  •  4
  •   Jon Skeet    16 年前

    不要把任何东西宣布为 IEquatable<T> . 正如马克所说,在继承和平等方面,这通常是个问题。

    相反,在这个特定的字典中,找出您想要的键的相等性,并实现 IEqualityComparer<Foo> ,然后将其传递到字典构造函数中。

    如何比较特定情况下的键是相当清楚的。

        2
  •  0
  •   herzmeister    16 年前

    这取决于你的课程代表什么。所以没有“通用”的解决方案。如果有,那么 System.Object 将实施 IEquatable<object> 一切都继承自 object 反正已经有了。所以你也可以问同样的问题 Object 而不是 Foo .

    长话短说,这取决于您希望通过类层次结构实现什么。

    总之,我同意很难确定是什么使对象相等,因为即使对于相同的对象类型,也可能有不同的要求。使用缓存时,相等性将由对象的实体ID确定。使用Do-/Undo列表时,需要另一个限定符,因为列表中的每个对象的ID都可能相同。

    我想我有点离题了,但我希望我能给你一些有用的观点

        3
  •  0
  •   michalburger1    16 年前

    您始终可以在字典构造函数中指定自己的相等比较器。如果你不这样做,字典会找你的 IEquatable<TKey> 所以在你的情况下 IEquatable<Foo>

        4
  •  0
  •   Marc Gravell    16 年前

    当您开始获得继承时,选择一个 T Equals GetHashCode .

    sealed .

        5
  •  0
  •   supercat    14 年前

    IEquatable<T> T 应该这样做,以便 IEquatable<T>.Equals 将匹配 Object.Equals IEquatable<Foo> 对某些人来说 Foo 派生类改变了 对象。等于 但不重新实施 IEquatable<Foo>.Equals 后者的语义与前者匹配的唯一方法是接口实现简单地调用虚拟对象 对象。等于 本身;如果接口只是将其参数传递给 对象。等于 ,实施它没有任何好处。