2016-01-21 54 views
0

我米用工會在兩個大名單(超過100萬個)和IT方面很慢(幾分鐘)的快速工會 我需要的功能來刪除重複,所以我不能使用CONCAT和我的名單沒有排序。 有更快的方法嗎?也許使用plinq兩個大名單

+0

你需要向我們展示您的代碼。兩個100萬個物品清單應該能夠在<1秒內「聯合」。 – Rob

+1

請注意,我的基準,其中:產生200萬隨機整數,工會和轉儲結果計數'0.083'秒運行一次。 – Rob

+3

心理調試:您的列表包含未實現'Equals'或'GetHashCode',所以你得到一個默認(慢)通過使用反射的CLR提供的實現自定義的結構。有關實施建議,請參閱http://code.logos.com/blog/2010/02/creating_equatable_objects.html。 –

回答

3

你是不是說什麼都在列表中的項目,但一個選項是使用正確的數據結構,這個任務 - 要只保留獨特的項目 - 這是SET的定義,所以使用HashSet的。

var hashSet = new HashSet<int>(list1); 
hashSet.UnionWith(list2); 

另外我測量時間碼以上VS Linq.Union:

var list3 = list1.Union(list2).Distinct(); 

,這裏是定時(HashSet.UnionWith作品幾乎快一倍):

HashSet.UnionWith 
real 0m4.111s 
user 0m3.890s 
sys 0m0.132s 

real 0m4.562s 
user 0m4.074s 
sys 0m0.170s 

real 0m4.052s 
user 0m3.851s 
sys 0m0.129s 

real 0m4.003s 
user 0m3.814s 
sys 0m0.125s 

real 0m4.058s 
user 0m3.858s 
sys 0m0.126s 


Linq.Union.Distinct 
real 0m7.579s 
user 0m7.014s 
sys 0m0.428s 

real 0m7.498s 
user 0m6.965s 
sys 0m0.419s 

real 0m7.596s 
user 0m6.994s 
sys 0m0.412s 

real 0m7.446s 
user 0m6.917s 
sys 0m0.416s 

real 0m7.452s 
user 0m6.928s 
sys 0m0.403s 
+0

我相信'Union'使用'內部Set',這樣的表現應該是相當類似的 – Rob

+0

@Rob它實際上使用的內部設置類沒有的HashSet(https://github.com/dotnet/corefx/blob/master/src/ System.Linq的/ src目錄/系統/ LINQ的/ Enumerable.cs#L3645),不知道他們是否有'add'操作相同的性能,讓我查一下。 – vittore

+0

@Rob對我來說,UnionWith的工作速度比Mono上的Linq.Union快20-25%。 – vittore