2008-10-20 76 views
3

我有一个实现了IComparable的自定义类。该类存储在通用列表中。我现在需要与列表进行比较,以查看哪些对象在列表A中,但列表B中没有。如何获得通用列表中的比较项目

我认为这样做最简单的方法是遍历列表B并执行A.contains()。

我不知道如何让它使用我的CompareTo()(或其他方法,我可以重写,以便我可以说,如果它包含某个对象或不)。我可能是错的,但据我了解,包含检查对象是否实际上是相同的(即指向内存中的相同位置)。

任何人都可以帮助我吗?

回答

5

为什么不重写Equals你的班级的方法与CompareTo(other) == 0一致?这是最简单的方式,也是最惯用的,因为你已经注意到,Contains比较平等而不是使用CompareTo。但是,此检查通过Equals完成。它确实不是检查对象是否指向相同的内存位置。

/编辑:此外,如果您使用的是.NET 3.5,则可以使用接受IEqualityComparer参数的Contains超载。您可以使用它来提供一个为您的类类型实现自定义平等关系的类。不过,我认为第一种方法在你的情况下更合适。

0

非常感谢Konrad为我们提供了一个快速而有用的回复。工作过一种享受!我原来使用IComparable是因为我需要按某些标准对它们进行排序,但覆盖equals可以完美地用于.contains。

:)

0

它包含检查的对象实际上是相同的(即指向内存中的同一个地方)

注意,对象可以是相等时,即使他们不这样做指向内存中的相同位置。这取决于如何实现EqualsTo方法。

我同意鲁道夫,你首先尝试重载EqualsTo()。

1

此外,如果你使用的是框架3.5,你可以进行查询,如:

列表notInB =从listA的(没有listB.find(函数(X)= x.property item.property)=)项,其中选择项目

这将返回listA中不在listB中的所有项目。

linq函数find返回与您在lambda函数中写入条件相符的项目。在那里你可以使用添加更多条件和(或& &)或或(||)

如果你使用这个,没有必要实现IComparable。

+0

我们只在工作中使用2.0,但LINQ将会是非常酷的做这个整个应用程序tbh的方式。谢谢 – Jon 2008-10-20 13:38:42

0

还有一个IEquatable,如果你的对象实现了这个接口,那么它被所有通用集合自动使用,如果它被实现的话。虽然我从来不明白为什么它首先存在,因为文档说如果你实现IEquatable,那么你也应该覆盖Equals来匹配。还要记住,如果您要覆盖Equals,那么您还需要重写GetHashCode。