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

问题描述:

'Equal'和'GetHashcode'方法存在于对象类中,而我们的类型继承了对象基类。 直接实现对象的两种方法和使用IComparer接口有什么不同?为什么我们需要IEqualityComparer,IEqualityComparer <T>接口?

如果我们重写对象的Equal和GetHashCode,并推送到散列表,它会使用overring的等号方法吗?

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

当需要能够“排序”对象的IComparable接口被使用,并且它给你告诉你,如果两个对象<,或者=>的方法(CompareTo)。使用IEqualityComparer的构造函数可让您给出与您的对象定义的值不同的特定Equals/GetHashCode。通常Hashtable将使用您的对象覆盖EqualsGetHashCode(或基地objectEqualsGetHashCode)。

做出了榜样,标准字符串区分大小写的方式进行比较("A"!= "a"),但你可以做一个IEqualityComparer辅助类能够哈希您的字符串大小写不敏感的方式。 (技术上这个类是已经存在多个变种:他们被称为StringComparer.InvariantCultureIgnoreCase和所有的StringComparer其他静态方法返回一个StringComparer对象实现了IComparerIEqualityComparerIComparer<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方法。