与CLR的角度有什么不同以实现的 IEqualityComparer vs覆盖 == 您将在 IEqualityComparer<T>?如果是这样,您什么时候可以使用另一个?

编辑

好的,确实有意义的是,IEQAULITYCOMPARER由Hashtable的实现使用 - 当我发布问题时,它脱颖而出。那么,Ienumerable的Linq的扩展呢?这是否意味着在执行这些扩展方法时,.NET会构建一个标签?

有帮助吗?

解决方案

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();
    }

  }

但是平等是人:

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 eleseconcomparer),...)

其他提示

iequalityComparer哈希表, 名称valuecollection订购 为了支持您类型的“平等”的自定义定义。这就是为什么它提供的 gethashcode(), ,这与平等无关 本身.

如果您不提供 IEqualityComparer, ,上面提到的类将默认为 object.equals(), ,实施 参考平等. 。超载 operator == 在这种情况下不会被调用。

编辑: 某些LINQ的扩展方法确实采用了 IEqualityComparer 作为一个论点,但原理仍然相同:如果未指定该参数,该方法最终将比较参考,而不是值,并且 operator == 不会叫。

IEqualityComparer 例如用于比较 Dictionary<TK,TV>.

它与覆盖完全不同 == 操作员,因为实际上 Dictionary (通常什么用 IEqualityComparer)不打电话 == 操作员。

最多可以比较“实施 IEqualityComparer “ vs”覆盖 GetHashCodeEquals 方法”,因为确实是获得同一件事的两种方法(我想说它们与我平等)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top