首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们需要IEqualityComparer,IEqualityComparer<T>接口?

为什么我们需要IEqualityComparer,IEqualityComparer<T>接口?
EN

Stack Overflow用户
提问于 2011-10-13 16:09:43
回答 2查看 2.8K关注 0票数 7

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

如果我们覆盖object的Equal和GetHashCode,并推送到哈希表,它将使用覆盖环的equal方法?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-13 16:15:41

当需要对对象进行“排序”时,可以使用IComparable接口,它提供了一个方法(CompareTo),该方法可以告诉您两个对象是<、=还是>。使用IEqualityComparer的构造函数允许您提供一个特定的Equals/GetHashCode,它可以不同于您的对象所定义的那些。通常,Hashtable将使用被覆盖的对象EqualsGetHashCode (或基本objectEqualsGetHashCode)。

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

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

票数 15
EN

Stack Overflow用户

发布于 2011-10-13 16:24:13

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

Compare方法允许您将对象本身与另一个实例进行比较。当然,当当前实例为空时,您将在本例中获得一个NullReferenceException,因为您在“空”实例上调用Compare。实现IComparer的类可以解决这个问题。

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

代码语言:javascript
复制
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.
    }
}

这使您可以执行以下操作:

代码语言:javascript
复制
var c = new MyObjectComparer();
var one = new MyObject();
var two = new MyObject();
c.Compare (one, two);

当您使用指定IEqualityComparer实例的构造函数实例化Hashtable时,这意味着给定的IEqualityComparer将用于确定某个键是否已经存在于哈希表中。

否则,将使用key-object的Compare方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7751170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档