.net中的对象比较

时间:2010-12-22 18:36:21

标签: c# .net iequalitycomparer

与CLR的观点是否有任何不同,以实现IEqualityComparer vs覆盖==运算符以获取您在IEqualityComparer<T>中使用的属性?如果是这样,你什么时候用另一个?

修改

好吧,Hashtable的实现所使用的IEqaulityComparer确实有意义 - 当我发布问题时,它已经脱离了我的脑海。那么IEnumerable的Linq的扩展呢?这是否意味着.net在执行这些扩展方法时会构建一个Hashtable?

3 个答案:

答案 0 :(得分:2)

{p> IEqualityComparerHashtableNameValueCollectionOrderedDictionary类使用,以支持您的类型的“相等”的自定义定义。这就是它提供GetHashCode()的原因,它与本身没有太大关系。

如果您未提供IEqualityComparer,则上述类将默认为Object.Equals(),这将实现引用相等。在该上下文中不会调用重载的operator ==

编辑:有些LINQ的扩展方法确实以IEqualityComparer为参数,但原理保持不变:如果未指定该参数,该方法将最终比较引用,不是值,并且不会调用operator ==

答案 1 :(得分:1)

IEqualityComparer不是equal,等于对象(实例方法),但是EqualityComparer用于装饰,例如你想要特定区别的linq:

personList.OrderBy(p=>p.ID).Distinct(new MyEqualityComparer())

  class MyEqualityComparer: IEqualityComparer<Person>
  {

    public bool Equals(Person p1, Person p2)
    {
       if (p1.Age == p2.Age)
          return true;
       return false;
    }


    public int GetHashCode(Person p)
    {
        return p.Id.GetHashCode();
    }

  }

但对于Person来说是相同的:

public class Person
{
 public int ID{get;set;}
 public int Age{get;set;}
 public override bool Equals(object o)
 {
   //do stuff
 }
}

你可以通过IEqualityComparer进行任意数量的修饰,但你不能通过实例方法做到这一点(你可以写personList.Distinct(new AnotherComparer),...)

答案 2 :(得分:1)

IEqualityComparer用于比较Dictionary<TK,TV>

它与覆盖==运算符完全不同,因为实际Dictionary(通常无论使用IEqualityComparer)都不会调用==运算符。

最多,您可以比较“实施IEqualityComparer”与“覆盖GetHashCodeEquals方法”,因为实际上他们有两种方法来获得同样的东西(我会说他们和我一样。)