2011-10-05 128 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感興趣。