如何获取通用列表中的比较项目

时间:2008-10-20 13:11:03

标签: c#

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

我认为最简单的方法是迭代列表B并执行A.contains()。

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

有人可以帮我吗?

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

list notInB = from listA中的项目(listB.find(function(x)x.property = item.property)= nothing)select item

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

linq函数find返回与您在lambda函数中写入的de条件匹配的项。在那里,您可以使用和(&&)或或(||)

添加更多条件

如果您使用此功能,则无需实施IComparable。

答案 2 :(得分:0)

感谢Konrad的快速回复。做了一个享受!我最初使用IComparable是因为我需要按照某些标准对它们进行排序,但是重写等于完全适用于.contains。

:)

答案 3 :(得分:0)

  

包含检查对象是否实际相同(即指向内存中的同一位置)

请注意,即使对象未指向内存中的相同位置,对象也可以相等。这取决于EqualsTo方法的实现方式。

我同意Rudolph的意见,你首先尝试重载EqualsTo()。

答案 4 :(得分:0)

还有IEquatable,如果您的对象实现了该接口,那么如果实现了它,它将自动被所有泛型集合使用。虽然我从来没有完全理解为什么它首先存在,因为文档说如果你实现IEquatable,那么你也应该重写Equals来匹配。还要记住,如果你要覆盖Equals,你还需要覆盖GetHashCode。