自定义类:使用LINQ

时间:2016-05-11 19:07:59

标签: c# linq interface

我经常使用LINQ查询,修改和管理自定义类的列表(或词典)。

碰巧,例如,Contains方法给了我奇怪的结果,最终我发现它希望IEquatable接口能够正确理解该对象实际上在列表中。< / p>

你有一个方便的接口列​​表,我的类应该实现它以适应所有典型的LINQ结构(如Discinct,Contains,Except等)?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以覆盖班级上的Equals方法。如果您不覆盖Equals,则DistinctContains(等)正在检查两个项目是否实际上都是对同一对象的引用。您可能希望它识别具有相同属性的两个不同对象。

另一种选择是创建另一个实现IEqualityComparer<T>的类,该类执行T的两个实例的比较。这样做的好处是您不必修改原始类。此外,您可以定义不同的比较器,以便在一次比较中两个类相等,但在另一个比较中它们不是。您只能在需要时使用IEqualityComparer<T>

答案 1 :(得分:2)

IEquatable应该是确定一个实例是否等于另一个实例所需的全部内容。

如果您打算将类型用作散列集合的键(例如DictionaryHashTable),那么 覆盖object.GetHashCode()并且object.Equals(object)。即使你,它仍然是一个好主意,因为如果你已经实施了object.Equals,覆盖IEquatable是微不足道的,并且覆盖object.Equals(object)要求你也可以覆盖GetHashCode