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

时间:2011-10-13 08:09:43

标签: .net hashtable iequalitycomparer

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

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

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

2 个答案:

答案 0 :(得分:14)

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

举一个例子,标准字符串以区分大小写的方式进行比较("A"!= "a"),但你可以创建一个IEqualityComparer助手类来散列你的字符串以不区分大小写的方式。 (从技术上讲,这个类已经存在于多个变体中:它们被称为StringComparer.InvariantCultureIgnoreCase,而StringComparer的所有其他静态方法都返回一个实现StringComparer的{​​{1}}对象,{ {1}},IComparerIEqualityComparer

注意,IComparer<string>使用IEqualityComparer<string>可选参数,而不是通用版Hashtable,因为IEqualityComparer是预先通用的。

答案 1 :(得分:1)

IComparer接口(通用接口和非通用接口)允许您将两个实例相互比较。

Compare方法允许您将对象本身与另一个实例进行比较。当然,当前实例为空时,在这种情况下你将获得NullReferenceException,因为你在'null'实例上调用了Compare。实现IComparer的类可以克服这个问题。

因此,当您实现IComparer接口时,您将拥有一个具有'Compare'方法的类,可以这样调用:

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);

当您使用指定Hashtable实例的构造函数实例化IEqualityComparer时,这意味着将使用给定的IEqualityComparer来确定某个密钥是否已存在于哈希表。
否则,将使用key-object的Compare方法。