为什么我们需要IEqualityComparer,IEqualityComparer 接口?
'Equal'和'GetHashcode'方法存在于对象类中,而我们的类型继承了对象基类。 直接实现对象的两种方法和使用IComparer接口有什么不同?为什么我们需要IEqualityComparer,IEqualityComparer <T>接口?
如果我们重写对象的Equal和GetHashCode,并推送到散列表,它会使用overring的等号方法吗?
与IEqualityComparer构造函数有什么不同的新哈希表?
当需要能够“排序”对象的IComparable
接口被使用,并且它给你告诉你,如果两个对象<,或者=>的方法(CompareTo
)。使用IEqualityComparer
的构造函数可让您给出与您的对象定义的值不同的特定Equals
/GetHashCode
。通常Hashtable
将使用您的对象覆盖Equals
和GetHashCode
(或基地object
Equals
和GetHashCode
)。
做出了榜样,标准字符串区分大小写的方式进行比较("A"
!= "a"
),但你可以做一个IEqualityComparer
辅助类能够哈希您的字符串大小写不敏感的方式。 (技术上这个类是已经存在多个变种:他们被称为StringComparer.InvariantCultureIgnoreCase
和所有的StringComparer
其他静态方法返回一个StringComparer
对象实现了IComparer
,IEqualityComparer
,IComparer<string>
,IEqualityComparer<string>
)
作为一个说明,该Hashtable
用途一个IEqualityComparer
可选参数,而不是通用版本IEqualityComparer<T>
,因为Hashtable
是预泛型。
IComparer
接口(泛型和非泛型接口)允许您将两个实例相互比较。
Compare
方法允许您将对象本身与另一个实例进行比较。 Offscourse,在当前实例为空的情况下,在这种情况下,您将获得NullReferenceException
,因为您在“空”实例上调用Compare
。实施IComparer
的课程可以解决这个问题。
所以,当你实现IComparer接口,你必须具有“比较”的方法,它可以被称为像这样一类:
public class MyObjectComparer : IComparer<MyObject>
{
public int Compare(MyObject first, MyObject second)
{
// implement logic here to determine whether first is less, greater or equal then second.
}
}
这可以让你做到这一点:
var c = new MyObjectComparer();
var one = new MyObject();
var two = new MyObject();
c.Compare (one, two);
当你实例与在您指定的IEqualityComparer
实例构造一个Hashtable
,这意味着,给定IEqualityComparer
将被用来确定某个特定键是否已经存在于哈希表。
否则,将使用键对象的Compare方法。