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

Joh*_*ood 25 c#

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

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

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

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

Lee*_*Lee 42

这意味着它将使用返回的比较器作为集合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.

  • 只是评论.如果`CustomClass`实现`IEquatable <CustomClass>`***而没有***覆盖`GetHashCode()`,那么`EqualityComparer <CustomClass> .Default`会出现故障(所以`HashSet <CustomClass>`会出现故障). (5认同)

adr*_*nks 6

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

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

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