2011-10-05 130 views
4

我有2个列表,我试图比较。我执行以下命令,我得到了false返回值:使用Linq比较2个列表

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

部分工作。我的列表不相等。问题是,我使用下面的命令,试图寻找差异:

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

我的问题是,fileDiff将返回一个空的结果集。既然我知道他们不一样,我不应该得到什么回报?也许我的查询是错误的。任何帮助,将不胜感激!顺便说一下,如果你确实需要它,我可以发布更多的代码,但是,这应该足够了。

+1

我们在这里谈论的是什么样的差异?订购?对象继续 –

+0

你可以给我们list1和list2的内容吗? –

+0

你的列表中有什么类型的对象?你确定默认比较器正在做你认为它的吗? –

回答

6

你不会得到任何东西,如果:

  • list2包含一切list1而且额外的项目
  • 的排序是不同的

假设你不关心的排序,你可以使用:

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

如果你关心订单,您需要制定出完全是您希望如何表示差异。

+0

我并不关心订单。我正在做的是比较目录中的文件。 'list1'是目录1的文件内容,'list2'是目录2的文件内容。我正在使用[本文](http://msdn.microsoft.com/en-us/library/bb546137.aspx)以供参考。 – Icemanind

+0

@icemanind:对,在这种情况下,我给你的代码应该没问题。 –

+0

完美的作品。谢谢! – Icemanind

1

SequenceEqual()只有当元素和元素序列相同时才会返回true。

Except()将仅比较元素,而不是序列。

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

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”的方式的...

0

SequenceEqual关心序列(这是暗示在它的名字;)),但Except没有。

  • 所以这是完全可能的,list2包含相同的元素,list1但在不同的顺序,所以SequenceEqual回报falseExcept返回任何元素。
  • 它也有可能是list2是一个适当的超集的list1的,在这种情况下返回SequenceEqualfalse无论顺序,并且仍然Except返回任何元件。

如果你想与集合运算工作,你可能会更好,如HashSetSortedSet直接使用某些设置样容器。就你而言,你可能对HashSet.SetEquals和/或HashSet.ExceptWith感兴趣。