English 中文(简体)
如何在通用列表中获取比较项
原标题:
  • 时间:2008-10-20 13:11:02
  •  标签:

我有一个自定义类实现了IComparable。此类存储在Generic List中。现在我需要比较两个列表,查看哪些对象在列表A中但不在列表B中。

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

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

可以有人帮我吗?

最佳回答

你为什么不覆盖你的类的Equals方法,使其与CompareTo(other) == 0的意思一致?这是最简单,也是最惯用的方法,因为正如你所注意到的,Contains比较的是相等性,而不是使用CompareTo。然而,这个检查是通过Equals完成的。它不检查对象是否指向相同的内存位置。

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

问题回答

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

列表notInB = 从列表A中选择item,其中(listB.find(function(x) x.property = item.property) = nothing)

这将返回列表A中所有不在列表B中的项目。

linq函数find返回与您在lambda函数中编写的条件匹配的项目。在那里,您可以使用and(&&)或or(||)添加更多条件。

如果您使用此功能,就不需要实现IComparable。

谢谢Konrad您的快速且有效的回复。太棒了!我最初使用IComparable是因为我需要按照特定的条件对它们进行排序,但重写equals对.contains非常有效。

把这个翻译成中文:)

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

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

我同意Rudolph的观点,你应该首先尝试重载EqualsTo()方法。

还有IEquatable,如果您的对象实现了该接口,则所有泛型集合都会自动使用它。尽管我从未完全理解它为什么存在,因为文档中说如果您实现了IEquatable,则还应该覆盖Equals以进行匹配。还要记住,如果要覆盖Equals,则还需要覆盖GetHashCode。





相关问题
热门标签