C# 比较两个列表

C# 比较两个列表,c#,linq,C#,Linq,比较2个列表的最佳途径是什么 列表2可以包含比列表1更多的值,这是正常的。只需要确保列表2包含列表1中的所有内容。它们的顺序也不相同。这将让您知道列表2是否不包含列表1中的项目: list1.Any(x => !list2.Contains(x)); 你可以把它放在一个变量中,这样你就不必考虑双重否定: var list2ContainsList1 = !list1.Any(x => !list2.Contains(x)); 一种方法是: List1.All(o => Li

比较2个列表的最佳途径是什么


列表2可以包含比列表1更多的值,这是正常的。只需要确保列表2包含列表1中的所有内容。它们的顺序也不相同。

这将让您知道列表2是否不包含列表1中的项目:

list1.Any(x => !list2.Contains(x));
你可以把它放在一个变量中,这样你就不必考虑双重否定:

var list2ContainsList1 = !list1.Any(x => !list2.Contains(x));
一种方法是:

List1.All(o => List2.Contains(o));
这表示当且仅当列表1中的每个项目都包含在列表2中时返回true,您可以使用它来查找两个集合的集合差异

var hasAllItems = !list2.Except(list1).Any();

最简单的方法是在您的情况下使用,您不关心列表中元素的顺序:

var elementsInList2NotInList1 = list2.Except(list1);
请记住,此方法使用比较值。如果您确实关心元素的顺序,那么您需要做额外的工作,以便检查列表中的每个元素如何等于另一个列表中的一个元素。额外工作如下:

创建自己的比较器,实现接口; 为自定义数据类型创建您自己的方法。
我假设List是一个最合适、最完美的解决方案,我认为如果在应用程序中使用自定义对象,还需要实现函数GetHashCodeList@TimSchmelter我想你在暗示这些对象可能没有一个合理的平等定义。对于这一点,还不确定情况是否如此。如果是,几乎任何解决方案都会有这个问题。我认为,如果需要一个单独的问题,就要为该类型定义适当的等式。这就是我想指出的。你也对,其他方法也有同样的问题。特别值得一提的是,OP可能没有使用实现Equals+GetHashCode的已知类型。@TimSchmelter当然,提到它很好。与其他已经存在的答案相比,这个答案如何增加价值?已经显示了这个精确的方法。@对不起,我没有注意到。他比我快:-@Default我添加了一些对用户有帮助的额外信息。问题特别提到顺序不是问题。也就是说,定义一个自定义等式比较器并不是处理它的方法。@Servy是的,我读过了。我认为,如果用户将来需要考虑顺序进行比较,那么关于事物如何工作的一些额外信息也会对用户有用。不是吗?那么还有什么选择呢?@TimSchmelter,更新版。输入一个变量来解决双重负面问题。@AaronPalmer:现在它甚至是不正确的。您正在检查List1中是否至少有一个对象不在List2中,但变量的含义正好相反。这正是我想说的问题@TimSchmelter,对不起,这是漫长的一天。抱歉,我已经切换了变量名以匹配OPs问题。