当前位置:  开发笔记 > 编程语言 > 正文

使用IDictionary(.NET)的指南

如何解决《使用IDictionary(.NET)的指南》经验,为你挑选了1个好方法。

我相信IDictionary类对可排序对象更有效.我还相信IComparer接口是从类中排序对象所必需的.我还在MSDN上读到,当你实现IComparable时,你需要覆盖Equals方法(和我假设的扩展GetHashCode).

我有三个疑问:

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

2)当我实现IComparer时,我必须遵循相同的IComparable指南吗?

3)当我重写Equals方法时,我必须覆盖==运算符,或者只是反转是真的?



1> Jon Skeet..:

(我已将大部分内容遗漏给泛型 - 相同的原则适用于泛型和非泛型形式.没有非通用的IEquatable接口,因为System.Object已经具有相关的方法.)

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

除非您使用实际对键进行排序的字典,否则您应该更感兴趣IEqualityComparer并且IEquatable- 您不需要能够说一个对象大于或小于另一个对象,只要它们是否相等并且一个对象的哈希码是什么(以与之一致的方式Equals).

实现IEquatable就像实现一样IComparable- 它意味着一个对象可以将自己与指定类型的另一个对象(通常是相同的类型)进行比较.虽然你不必覆盖,以实现IEquatable等于(对象),它会被强烈推荐.

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

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

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有