与CLR的观点是否有任何不同,以实现IEqualityComparer
vs覆盖==
运算符以获取您在IEqualityComparer<T>
中使用的属性?如果是这样,你什么时候用另一个?
修改
好吧,Hashtable的实现所使用的IEqaulityComparer确实有意义 - 当我发布问题时,它已经脱离了我的脑海。那么IEnumerable的Linq的扩展呢?这是否意味着.net在执行这些扩展方法时会构建一个Hashtable?
答案 0 :(得分:2)
如果您未提供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
”与“覆盖GetHashCode
和Equals
方法”,因为实际上他们有两种方法来获得同样的东西(我会说他们和我一样。)