我经常使用LINQ查询,修改和管理自定义类的列表(或词典)。
碰巧,例如,Contains方法给了我奇怪的结果,最终我发现它希望IEquatable接口能够正确理解该对象实际上在列表中。< / p>
你有一个方便的接口列表,我的类应该实现它以适应所有典型的LINQ结构(如Discinct,Contains,Except等)?
谢谢!
答案 0 :(得分:2)
您可以覆盖班级上的Equals
方法。如果您不覆盖Equals
,则Distinct
和Contains
(等)正在检查两个项目是否实际上都是对同一对象的引用。您可能希望它识别具有相同属性的两个不同对象。
另一种选择是创建另一个实现IEqualityComparer<T>
的类,该类执行T
的两个实例的比较。这样做的好处是您不必修改原始类。此外,您可以定义不同的比较器,以便在一次比较中两个类相等,但在另一个比较中它们不是。您只能在需要时使用IEqualityComparer<T>
。
答案 1 :(得分:2)
IEquatable
应该是确定一个实例是否等于另一个实例所需的全部内容。
如果您打算将类型用作散列集合的键(例如Dictionary
或HashTable
),那么 覆盖object.GetHashCode()
并且object.Equals(object)
。即使你不,它仍然是一个好主意,因为如果你已经实施了object.Equals
,覆盖IEquatable
是微不足道的,并且覆盖object.Equals(object)
要求你也可以覆盖GetHashCode
。