题
与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”覆盖 GetHashCode
和 Equals
方法”,因为确实是获得同一件事的两种方法(我想说它们与我平等)。