我有一个实现IComparable的自定义类。该类存储在通用列表中。我现在需要与列表进行比较,以查看哪些对象在列表A中但不在列表B中。
我认为最简单的方法是迭代列表B并执行A.contains()。
我不知道如何使用我的CompareTo()(或我可以覆盖的其他方法,以便我可以说它是否包含某个对象)。我可能是错的,但据我所知,包含检查对象实际上是否相同(即指向内存中的相同位置)。
有人可以帮我吗?
答案 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。