对象类中存在'Equal'和'GetHashcode'方法,我们的类型继承了对象基类。 直接实现对象的两个方法和使用IComparer接口有什么不同?
如果我们覆盖对象的Equal和GetHashCode,并推送到哈希表,它将使用overring的相等方法吗?
与IEqualityComparer构造函数的新哈希表的不同之处是什么?
答案 0 :(得分:14)
当您需要能够“排序”对象时使用IComparable
接口,它会为您提供一个方法(CompareTo
),告诉您两个对象是否为<,=或> ; 。使用IEqualityComparer
的构造函数允许您提供特定的Equals
/ GetHashCode
,它可以与您的对象定义的不同。通常,Hashtable
会使用您的对象覆盖Equals
和GetHashCode
(或基础object
Equals
和GetHashCode
)。
举一个例子,标准字符串以区分大小写的方式进行比较("A"
!= "a"
),但你可以创建一个IEqualityComparer
助手类来散列你的字符串以不区分大小写的方式。 (从技术上讲,这个类已经存在于多个变体中:它们被称为StringComparer.InvariantCultureIgnoreCase
,而StringComparer
的所有其他静态方法都返回一个实现StringComparer
的{{1}}对象,{ {1}},IComparer
,IEqualityComparer
)
注意,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方法。