2010-01-13 38 views
13

我有一個很大的列表(約110,000個字符串),我需要將它與一個類似大小的列表進行比較。使用C#和LINQ來比較兩個大型字符串列表的最佳方法?

列表A來自1個系統。 列表B來自一個SQL表(我只能讀,沒有存儲過程等)

什麼是最好的方式來找到列表A中的值,不再存在於列表B?

100,000個字符串是數組中要處理的大數目嗎?

感謝

+0

當你說列表b來自一個SQL表,這是否意味着列表b被加載到內存中,或者它是像一個SQL讀取器數據集,你一次只能看到一個項目? – kemiller2002 2010-01-13 20:42:20

+0

你使用Linq to SQL作爲你的列表b嗎? – 2010-01-13 20:43:09

+0

我正在使用tableadapter,所以它在內存中用於SQL表數據(列表B)。 列表A我正在讀入一個ArrayList,但可以使用列表。 – Donaldinio 2010-01-13 20:54:05

回答

26

所以,你有一個像兩個列表這樣:

List<string> listA; 
List<string> listB; 

然後使用Enumerable.Except

List<string> except = listA.Except(listB).ToList(); 

請注意,如果你想,說,忽略大小寫:

List<string> except = listA.Except(listB, StringComparer.OrdinalIgnoreCase).ToList(); 

你可以用您選擇的IEqualityComparer<string>代替最後一個參數。

9

使用LINQ:

var missing = listA.Except(listB).ToList(); 
+0

不錯。與此類似:http://msdn.microsoft.com/en-us/library/bb397894.aspx 我不習慣處理大型數據集,那麼100,000容易通過這種方式處理? – Donaldinio 2010-01-13 20:46:38

+0

當然;如果不是,你將不得不在db上工作,所以C#無論如何; -p – 2010-01-14 23:16:32

2
List<string> A = //get from file 
List<string> B = //get from db 

var C = A.Except(B); 
5

出於興趣,你必須使用List<string>?因爲在.net 3.5 SP1中,您可以使用HashSet和它的ExceptWith方法。據我瞭解,HashSets專門針對兩套之間的比較進行了優化。

+0

不需要使用列表。我會看看HashSet。謝謝! – Donaldinio 2010-01-15 14:27:46