'Equal' 和 'GetHashcode' 方法存在于对象类中,我们的类型继承了对象基类。直接实现对象的两种方法和使用 IComparer 接口有什么区别?
如果我们覆盖对象的 Equal 和 GetHashCode ,并推送到一个 hashtable ,它会使用覆盖的 equal 方法吗?
带有 IEqualityComparer 构造函数的新哈希表有什么不同?
'Equal' 和 'GetHashcode' 方法存在于对象类中,我们的类型继承了对象基类。直接实现对象的两种方法和使用 IComparer 接口有什么区别?
如果我们覆盖对象的 Equal 和 GetHashCode ,并推送到一个 hashtable ,它会使用覆盖的 equal 方法吗?
带有 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
方法允许您将对象本身与另一个实例进行比较。当然,当当前实例为空时,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);
当您Hashtable
使用指定实例的构造函数实例化 a 时IEqualityComparer
,这意味着给定IEqualityComparer
将用于确定某个键是否已存在于 Hashtable 中。
否则,将使用键对象的比较方法。