【问题标题】:Guidelines for using IDictionary (.NET)IDictionary (.NET) 使用指南
【发布时间】:2009-01-13 17:19:35
【问题描述】:

我相信 IDictionary 类更适用于可排序的对象。我还相信 IComparer 接口对于对类中的对象进行排序是必要的。我还在MSDN 上读到,当你实现 IComparable 时,你需要重写 Equals 方法(我假设是 GetHashCode 的扩展)。

我有三个疑惑:

1) 上述任何假设都不正确?

2) 当我实施 IComparer 时,我必须遵循相同的 IComparable 准则吗?

3) 当我重写 Equals 方法时,我将不得不重写 == 运算符,或者正好相反?

【问题讨论】:

    标签: .net


    【解决方案1】:

    (我已经把泛型去掉了大部分——泛型和非泛型形式的原则相同。没有非泛型 IEquatable 接口,因为 System.Object 已经有相关方法。)

    对象不必是可排序的以用作IDictionary 键。但是,它们必须具有合理的哈希码和相等性实现。

    除非您使用的是真正排序键的字典,否则您应该对 IEqualityComparer<T>IEquatable<T> 更感兴趣 - 您不需要能够说一个对象大于或小于另一个,只是它们是否相等以及一个对象的哈希码是什么(以与Equals一致的方式)。

    实现IEquatable 就像实现IComparable - 这意味着一个对象可以将自身 与另一个指定类型(通常是相同类型)的对象进行比较。尽管您没有必须重写 Equals(object) 以实现 IEquatable,但强烈建议您这样做。

    实现IEqualityComparer 就像实现IComparer - 而不是将“this”对象与另一个对象进行比较,Equals/Compare 方法需要两个 值进行比较。 IEqualityComparer/IComparer 的实现很少覆盖 object.GetHashCodeobject.Equals,除非他们想要允许比较器的比较 - 很少有用。

    对于您的第三点:覆盖 Equals 当然不会强迫您重载 == (您不能覆盖运算符,只能重载它们)。您可以选择是否要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多