7

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

如果我们覆盖对象的 Equal 和 GetHashCode ,并推送到一个 hashtable ,它会使用覆盖的 equal 方法吗?

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

4

2 回答 2

15

IComparable当您需要能够“排序”对象时使用该接口,它为您提供了一个方法 ( CompareTo),告诉您两个对象是 <、= 还是 >。使用的构造函数可以IEqualityComparer让你给出一个特定的Equals/ GetHashCode,它可以与你的对象定义的不同。通常,Hashtable将使用您的对象覆盖EqualsGetHashCode(或基础object EqualsGetHashCode)。

举个例子,标准字符串以区分大小写的方式("A"!= "a")进行比较,但您可以创建一个IEqualityComparer帮助类,以便能够以不区分大小写的方式散列您的字符串。(从技术上讲,这个类已经存在于多个变体中:它们被调用StringComparer.InvariantCultureIgnoreCase并且所有其他静态方法都StringComparer返回一个StringComparer实现IComparer, IEqualityComparer, IComparer<string>,的对象IEqualityComparer<string>

请注意,Hashtable使用IEqualityComparer可选参数,而不是通用版本IEqualityComparer<T>,因为Hashtable是前泛型。

于 2011-10-13T08:15:41.217 回答
1

接口(通用和非通用接口)允许您将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 中。
否则,将使用键对象的比较方法。

于 2011-10-13T08:24:13.087 回答