2011-09-07 234 views
6

這不是一個複雜的問題,但我不能用linq包裹我的頭。聯合列表使用Linq列表

我有包含Enumerable<T>Enumerable<string>

public class 
{ 
    List<List<string>> ListOfLists = new List<List<string>>(); 
} 

我基本上要返回從ListOfLists每個唯一的字符串;這是很容易使用foreach循環和存儲變量(我可能改善沒有在最後的明顯的效率,但是這不是重點):

List<string> result = new List<string>(); 

foreach (var v in ListOfLists) 
{ 
    foreach (var s in v) 
    { 
     result.Add(s); 
    } 
} 

result.Distinct(); 

如何做到這一點的LINQ?

+0

您已經有答案。我會建議在這個問題上使用Extension方法!您的擴展方法以優化的方式執行SelectMany和Distinct。 –

回答

8
var distinctStrings = ListOfLists.SelectMany(list => list).Distinct(); 
1
var result = ListOfLists.SelectMany(v => v).ToList().Distinct(); 

編輯:爲了更好的性能,用途:

var result = ListOfLists.SelectMany(v => v).Distinct(); 

var result = ListOfLists.SelectMany(v => v).Distinct().ToList(); 
+0

沒有必要在中間的那個ToList – RichK

+0

如果你確實需要ToList,在Distinct之後而不是之前做。在這種情況下,您的Distinct現在返回IEnumerable ,這可能不是您想要的。另外,在整個列表上執行ToList時會有一個內存/ perf命中,然後將結果限制爲Distinct,而不是先執行Distinct。 –

+0

@Jim Wooley - 偉大的建議。感謝你和RichK的反饋意見。我們已經學習了。 – Leons

5

爲了完整起見,查詢表達式語法是有時容易(我發現)至拿出比正確的調用SelectMany。這將是:

result = (from list in ListOfLists 
      from s in list 
      select s).Distinct().ToList(); 
+0

對於SelectMany上的查詢語法+1 –