我有一个实现了IComparable的自定义类。该类存储在通用列表中。我现在需要与列表进行比较,以查看哪些对象在列表A中,但列表B中没有。如何获得通用列表中的比较项目
我认为这样做最简单的方法是遍历列表B并执行A.contains()。
我不知道如何让它使用我的CompareTo()(或其他方法,我可以重写,以便我可以说,如果它包含某个对象或不)。我可能是错的,但据我了解,包含检查对象是否实际上是相同的(即指向内存中的相同位置)。
任何人都可以帮助我吗?
我有一个实现了IComparable的自定义类。该类存储在通用列表中。我现在需要与列表进行比较,以查看哪些对象在列表A中,但列表B中没有。如何获得通用列表中的比较项目
我认为这样做最简单的方法是遍历列表B并执行A.contains()。
我不知道如何让它使用我的CompareTo()(或其他方法,我可以重写,以便我可以说,如果它包含某个对象或不)。我可能是错的,但据我了解,包含检查对象是否实际上是相同的(即指向内存中的相同位置)。
任何人都可以帮助我吗?
为什么不重写Equals
你的班级的方法与CompareTo(other) == 0
一致?这是最简单的方式,也是最惯用的,因为你已经注意到,Contains
比较平等而不是使用CompareTo
。但是,此检查通过Equals
完成。它确实不是检查对象是否指向相同的内存位置。
/编辑:此外,如果您使用的是.NET 3.5,则可以使用接受IEqualityComparer
参数的Contains
超载。您可以使用它来提供一个为您的类类型实现自定义平等关系的类。不过,我认为第一种方法在你的情况下更合适。
非常感谢Konrad为我们提供了一个快速而有用的回复。工作过一种享受!我原来使用IComparable是因为我需要按某些标准对它们进行排序,但覆盖equals可以完美地用于.contains。
:)
它包含检查的对象实际上是相同的(即指向内存中的同一个地方)
注意,对象可以是相等时,即使他们不这样做指向内存中的相同位置。这取决于如何实现EqualsTo方法。
我同意鲁道夫,你首先尝试重载EqualsTo()。
此外,如果你使用的是框架3.5,你可以进行查询,如:
列表notInB =从listA的(没有listB.find(函数(X)= x.property item.property)=)项,其中选择项目
这将返回listA中不在listB中的所有项目。
linq函数find返回与您在lambda函数中写入条件相符的项目。在那里你可以使用添加更多条件和(或& &)或或(||)
如果你使用这个,没有必要实现IComparable。
还有一个IEquatable,如果你的对象实现了这个接口,那么它被所有通用集合自动使用,如果它被实现的话。虽然我从来不明白为什么它首先存在,因为文档说如果你实现IEquatable,那么你也应该覆盖Equals来匹配。还要记住,如果您要覆盖Equals,那么您还需要重写GetHashCode。
我们只在工作中使用2.0,但LINQ将会是非常酷的做这个整个应用程序tbh的方式。谢谢 – Jon 2008-10-20 13:38:42