我有一個很大的列表(約110,000個字符串),我需要將它與一個類似大小的列表進行比較。使用C#和LINQ來比較兩個大型字符串列表的最佳方法?
列表A來自1個系統。 列表B來自一個SQL表(我只能讀,沒有存儲過程等)
什麼是最好的方式來找到列表A中的值,不再存在於列表B?
100,000個字符串是數組中要處理的大數目嗎?
感謝
我有一個很大的列表(約110,000個字符串),我需要將它與一個類似大小的列表進行比較。使用C#和LINQ來比較兩個大型字符串列表的最佳方法?
列表A來自1個系統。 列表B來自一個SQL表(我只能讀,沒有存儲過程等)
什麼是最好的方式來找到列表A中的值,不再存在於列表B?
100,000個字符串是數組中要處理的大數目嗎?
感謝
所以,你有一個像兩個列表這樣:
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>
代替最後一個參數。
從this question偷竊,它看起來像你可以使用Except<T>()
方法。
使用LINQ:
var missing = listA.Except(listB).ToList();
不錯。與此類似:http://msdn.microsoft.com/en-us/library/bb397894.aspx 我不習慣處理大型數據集,那麼100,000容易通過這種方式處理? – Donaldinio 2010-01-13 20:46:38
當然;如果不是,你將不得不在db上工作,所以C#無論如何; -p – 2010-01-14 23:16:32
List<string> A = //get from file
List<string> B = //get from db
var C = A.Except(B);
出於興趣,你必須使用List<string>
?因爲在.net 3.5 SP1中,您可以使用HashSet和它的ExceptWith方法。據我瞭解,HashSets專門針對兩套之間的比較進行了優化。
不需要使用列表
當你說列表b來自一個SQL表,這是否意味着列表b被加載到內存中,或者它是像一個SQL讀取器數據集,你一次只能看到一個項目? – kemiller2002 2010-01-13 20:42:20
你使用Linq to SQL作爲你的列表b嗎? – 2010-01-13 20:43:09
我正在使用tableadapter,所以它在內存中用於SQL表數據(列表B)。 列表A我正在讀入一個ArrayList,但可以使用列表。 –
Donaldinio
2010-01-13 20:54:05