我相信IDictionary类对可排序对象的效果更好。我还相信IComparer接口是从类中排序对象所必需的。我还在MSDN读到,当你实现IComparable时,你需要覆盖Equals方法(和我假设的扩展GetHashCode)。
我有三个疑问:
1)上述任何假设都不正确?
2)当我实施IComparer时,我必须遵循相同的IComparable指南吗?
3)当我覆盖Equals方法时,我必须覆盖==运算符,或者只是反转是真的吗?
答案 0 :(得分:5)
(我把大部分内容遗漏了泛型 - 对于泛型和非泛型形式都有相同的原则。没有非通用的IEquatable接口,因为System.Object已经有了相关的方法。)
对象不必排序就可以用作IDictionary
个键。但是,它们必须具有合理的哈希码和相等的实现。
除非您使用实际上排序键的字典,否则您应该对IEqualityComparer<T>
和IEquatable<T>
更感兴趣 - 您不需要能够假设一个对象大于或小于另一个对象,只要它们是否相等以及一个对象的哈希码是什么(以与Equals
一致的方式)。
实现IEquatable
就像实现IComparable
一样 - 这意味着对象可以将自身与指定类型的另一个对象(通常是相同的类型)进行比较。虽然你没有有来重写Equals(object)以实现IEquatable,但强烈建议你这样做。
实现IEqualityComparer
就像实现IComparer
- 而不是将“this”对象与另一个对象进行比较,Equals / Compare方法将两个值进行比较。 IEqualityComparer
/ IComparer
的实现很少覆盖object.GetHashCode
或object.Equals
,除非他们想要比较比较器 - 很少有用。
对于你的第三点:覆盖Equals
当然不会强迫你重载==(你不能覆盖运算符,只能重载它们)。您可以选择是否要这样做。