使用Linq比较两个列表

4

我有2个列表需要比较。我执行以下操作,返回一个false值:

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

那部分是正常工作的。我的列表不相等。问题是,我正在使用以下命令尝试查找差异:

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

我的问题是,fileDiff 返回了一个空的结果集。由于我知道它们不相同,难道我不应该得到一些返回值吗?也许我的查询有问题。如果您能帮助我解决这个问题,我将不胜感激!顺便说一下,如果您确实需要,我可以发布更多的代码,但是这应该足够了。

1
我们在谈论什么样的差异?排序?对象内容? - Lasse V. Karlsen
你能给我们提供list1和list2的内容吗? - Jeremy McGee
你的列表中包含什么类型的对象?你确定默认的比较器正在按照你的意愿运作吗? - Pete M
4个回答

6

如果:

  • list2 包含 list1 中所有的元素以及额外的项
  • 顺序不同

假设您不关心顺序,您可以使用:

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

如果您确实关心顺序,那么您需要确定如何准确地表示差异。


我并不在意顺序。我的目的是比较一个目录中的文件。list1 是目录一的文件内容,list2 是目录二的文件内容。我正在参考这篇文章 - Icemanind
@icemanind:好的,那么在这种情况下,我给你的代码应该没问题。 - Jon Skeet

1

如果您正在寻找 对称差异(两个列表之间的所有不同之处,顺序不重要),那么您可以使用以下方法,这将会加重计算负担,但应该能够解决问题:

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

或者(根据Jon Skeet的回答):
var fileDiff = list1.Except(list2).Union(list2.Except(list1));

我会让社区的其他成员向您展示更有效的方法...但这是我能想到的最明显的“linq”方式...


1

SequenceEqual() 只有在元素及其顺序完全相同时才会返回 true。

Except() 仅比较元素,而不比较顺序。

显然,您的两个列表具有不同的顺序,但根据您发布的行为,我猜测它们都包含相同的元素。


0

SequenceEqual 关心顺序(这在它的名称中有所暗示;)), 但 Except 不关心。

  • 因此,list2 可能包含与 list1 相同的元素,但顺序不同,因此 SequenceEqual 返回 false,而 Except 不返回任何元素。
  • 也可能 list2list1 的超集,此时无论顺序如何,SequenceEqual 都会返回 false,而 Except 仍然不返回任何元素。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接