什么是集合类型的默认相等比较器?

时间:2013-06-20 22:30:35

标签: c#

在没有参数的HashSet构造函数的MSDN API中,它指出了

  

初始化一个空的HashSet类的新实例   对集合类型使用默认的相等比较器。

集合类型的默认相等比较器是什么,例如对于自定义类?

BTW:仅仅是我或MSDN API文档在解释上真的有点薄吗?我在阅读时不止一次地绊倒这些问题。

2 个答案:

答案 0 :(得分:40)

这意味着它将使用EqualityComparer<T>.Default返回的比较器作为集合的元素类型T

正如文件所述:

  

Default属性检查类型T是否实现了   System.IEquatable接口,如果是,则返回一个   使用该实现的EqualityComparer。否则,它   返回使用覆盖的EqualityComparer   由T。

提供的Object.Equals和Object.GetHashCode

因此,对于您的自定义类型,它将使用您定义的GetHashCode方法来查找集合中的项目。如果您已实施IEquatable<T>,则会使用IEquatable<T>.Equals(T)进行相等,否则将使用您的Equals(object)方法。此方法默认为引用object类中定义的相等性。因此,如果使用任一方法定义相等性,则应确保也覆盖GetHashCode

答案 1 :(得分:4)

默认情况下,它会委托给EqualityComparer<T>.Default。这将返回一个比较器,可以比较两个类型为T的对象。

对于自定义类,按以下顺序执行以下操作:

  • 如果类实现IEquatable<T>,它将委托给该类的接口实现
  • 如果该类定义了Equals方法,则会使用该<​​/ li>
  • 作为最后的手段,它将使用引用相等