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