为什么我们需要IEqualityComparer,IEqualityComparer <T>接口?

ran*_*all 6 .net hashtable iequalitycomparer

'Equal'和'GetHashcode'方法存在于对象类中,我们的类型继承了对象基类.直接实现对象的两个方法和使用IComparer接口有什么不同?

如果我们重写对象的Equal和GetHashCode,并推送到哈希表,它将使用overring的相等方法?

什么是新的哈希表与IEqualityComparer构造函数的不同之处?

xan*_*tos 15

IComparable当您需要能够"排序"对象时使用该接口,它会为您提供一个方法(CompareTo),告诉您两个对象是否为<,=或>.使用的构造函数IEqualityComparer允许您提供特定的Equals/ GetHashCode可以与您的对象定义的特定/ 不同.通常情况下,Hashtable将使用您的对象覆盖EqualsGetHashCode(或基础object EqualsGetHashCode).

举个例子,标准字符串以区分大小写的方式进行比较("A"!= "a"),但你可以让一个IEqualityComparer帮助器类能够以不区分大小写的方式对字符串进行哈希处理.(技术上这个类是已经存在多个变种:他们被称为StringComparer.InvariantCultureIgnoreCase和所有的其他静态方法StringComparer返回一个StringComparer实现对象IComparer,IEqualityComparer,IComparer<string>,IEqualityComparer<string>)

作为注释,Hashtable使用IEqualityComparer可选参数而不是通用版本IEqualityComparer<T>,因为它Hashtable是预先泛型.