I have 2 lists I am trying to compare. I execute the following and I get a false
value returned:
var areIdentical = list1.SequenceEq开发者_如何转开发ual(list2, myFileCompare);
That part is working. My lists are NOT equal. The problem is, I'm using the following command to try to find the differences:
var fileDiff = (from file in list1
select file).Except(list2, myFileCompare);
My problem is, fileDiff
is returning an empty result set. Since I know they are NOT identical, shouldn't I get something returned? Perhaps my query is wrong on this. Any help would be appreciated! By the way, I can post more of my code, if you really need it, however, this should suffice.
You wouldn't get anything if:
list2
contained everything inlist1
but also extra items- the ordering was different
Assuming you don't care about the ordering, you can use:
var extraItemsInList2 = list2.Except(list1);
var extraItemsInList1 = list1.Except(list2);
If you do care about the order, you'll need to work out exactly how you want the differences to be represented.
SequenceEqual()
will return true only if the elements as well as the element sequence is the same.
Except()
will compare only the elements, not the sequence.
Your two lists obviously have different sequences but, judging by the behavior you've posted, I'm guessing they both contain the same elements.
If you are after the symmetric difference (all differences between either list, ordering is not important) then you could use the following which will be heavy on the computation but should do the trick:
var fileDiff = list1.Union(list2).Except(list1.Intersect(list2));
Or (as per Jon Skeet's answer):
var fileDiff = list1.Except(list2).Union(list2.Except(list1));
I'll leave it to the rest of the community to show you a more efficient way to do it... But this is the most obvious "linq" way that I can think of...
SequenceEqual
cares about sequence (which is kind of hinted in its name ;) ), but Except
doesn't.
- So it is entirely possible that
list2
contains same elements aslist1
, but in different order, soSequenceEqual
returnsfalse
yetExcept
returns no elements. - It is also possible that
list2
is a proper super-set of thelist1
, in which caseSequenceEqual
returnsfalse
regardless of order, andExcept
still returns no elements.
If you want to work with set operations, you'll probably be better off using some set-like container such as HashSet
or SortedSet
directly. In your case, you might be interested in HashSet.SetEquals
and/or HashSet.ExceptWith
.
精彩评论