使用Linq比较2个列表

时间:2011-10-05 18:33:15

标签: c# linq

我想要比较两个列表。我执行以下操作并返回false值:

var areIdentical = list1.SequenceEqual(list2, myFileCompare);

那部分正在发挥作用。我的名单不相同。问题是,我正在使用以下命令来尝试找出差异:

var fileDiff = (from file in list1 
                select file).Except(list2, myFileCompare);

我的问题是,fileDiff返回一个空结果集。既然我知道它们不相同,我不应该得到一些东西吗?也许我的查询错了。任何帮助,将不胜感激!顺便说一句,我可以发布更多我的代码,如果你真的需要它,但是,这应该足够了。

4 个答案:

答案 0 :(得分:6)

如果出现以下情况,您将无法获得任何结果:

  • list2包含list1中的所有内容,但也包含额外的内容
  • 订购不同

假设您不关心订购,可以使用:

var extraItemsInList2 = list2.Except(list1);
var extraItemsInList1 = list1.Except(list2);

如果您 关心订单,则需要完全

答案 1 :(得分:1)

仅当元素和元素序列相同时,

SequenceEqual()才会返回true。

Except()只会比较元素,而不是序列。

你的两个列表显然有不同的序列,但是根据你发布的行为判断,我猜它们都包含相同的元素。

答案 2 :(得分:1)

如果你在symmetric difference之后(任何一个列表之间的所有差异,排序并不重要)那么你可以使用下面的计算重点,但应该这样做:

var fileDiff = list1.Union(list2).Except(list1.Intersect(list2));

或(根据Jon Skeet's answer):

var fileDiff = list1.Except(list2).Union(list2.Except(list1));

我会把它留给社区的其他人来向你展示一种更有效的方法......但这是我能想到的最明显的“linq”方式......

答案 3 :(得分:0)

SequenceEqual关心序列(在名称中暗示了这种情况;)),但Except没有。

  • 因此,list2完全有可能包含与list1相同的元素,但顺序不同,因此SequenceEqual会返回false但{ {1}}不返回任何元素。
  • Except也可能是list2的正确超集,在这种情况下,list1无论顺序如何都会返回SequenceEqualfalse仍然没有返回元素。

如果您想使用集合操作,最好直接使用某些类似集合的容器,例如ExceptHashSet。在您的情况下,您可能会对SortedSet和/或HashSet.SetEquals感兴趣。