34

HashSet在没有参数的构造函数的 MSDN API 中,它声明

初始化 HashSet 类的新实例,该实例为空并使用集合类型的默认相等比较器。

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

顺便说一句:仅仅是我还是 MSDN API 文档的解释真的有点薄?在阅读它时,我不止一次偶然发现这些问题。

4

2 回答 2

51

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

正如文档所述:

Default 属性检查 type 是否T实现了 System.IEquatable 接口,如果是,则返回使用该实现的 EqualityComparer。否则,它会返回一个 EqualityComparer,它使用由提供的 Object.Equals 和 Object.GetHashCode 的覆盖T

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

于 2013-06-20T22:34:23.703 回答
10

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

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

  • 如果该类实现IEquatable<T>了,它将委托给该类的该接口的实现
  • 如果该类Equals定义了一个方法,它将使用该方法
  • 作为最后的手段,它将使用引用相等
于 2013-06-20T22:37:36.880 回答