我想要比较两个列表。我执行以下操作并返回false
值:
var areIdentical = list1.SequenceEqual(list2, myFileCompare);
那部分正在发挥作用。我的名单不相同。问题是,我正在使用以下命令来尝试找出差异:
var fileDiff = (from file in list1
select file).Except(list2, myFileCompare);
我的问题是,fileDiff
返回一个空结果集。既然我知道它们不相同,我不应该得到一些东西吗?也许我的查询错了。任何帮助,将不胜感激!顺便说一句,我可以发布更多我的代码,如果你真的需要它,但是,这应该足够了。
答案 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
无论顺序如何都会返回SequenceEqual
,false
仍然没有返回元素。如果您想使用集合操作,最好直接使用某些类似集合的容器,例如Except
或HashSet
。在您的情况下,您可能会对SortedSet
和/或HashSet.SetEquals
感兴趣。