2014-11-21 64 views
9

我試圖實現一個方法來concartenate多個列表例如連接多個IEnumerable <T>

List<string> L1 = new List<string>{"1","2"}; 
List<string> L2 = new List<string>{"1","2"}; 
List<string> L3 = new List<string>{"1","2"}; 
var result = Concartenate(L1,L2,L3); 

,但我的方法不起作用:

public static IEnumerable<T> Concartenate<T>(params IEnumerable<T> List) 
{ 
    var Temp = List.First(); 
    for (int i = 1; i < List.Count(); i++) 
    { 
     Temp = Enumerable.Concat(Temp, List.ElementAt(i)); 
    } 
    return Temp; 
} 
+3

調用IEnumerable.Count()每個週期是有點浪費。調用它一次並將其存儲在一個變量中,或者更好地使用foreach循環:'var Temp = List.First(); (IEnumerable 序列List.Skip(1))Temp = Enumerable.Concat(sequence);'。 – 2014-11-21 08:51:17

回答

44

使用SelectMany

public static IEnumerable<T> Concatenate<T>(params IEnumerable<T>[] lists) 
{ 
    return lists.SelectMany(x => x); 
} 
4

如果你想使你的函數的工作,你需要的IEnumerable數組:

public static IEnumerable<T> Concartenate<T>(params IEnumerable<T>[] List) 
{ 
    var Temp = List.First(); 
    for (int i = 1; i < List.Count(); i++) 
    { 
     Temp = Enumerable.Concat(Temp, List.ElementAt(i)); 
    } 
    return Temp; 
} 
+1

參數'List'是一個IEnumerables數組,它可能不包含任何項目。這會導致List.First()拋出異常。你應該首先檢查這個數組的長度。我還將使用'Length'屬性和索引器'List []'而不是for循環中的等效Linq擴展。 – 2016-02-22 16:51:58

+0

不要使用公共類名作爲變量名。 =( – jpmc26 2017-07-08 00:35:58

0

所有你必須做的是改變:

public static IEnumerable<T> Concartenate<T>(params IEnumerable<T> List) 

public static IEnumerable<T> Concartenate<T>(params <IEnumerable<T>[] List) 

注意額外[]

1

只是爲了完整性,我發現另一種方法:

public static IEnumerable<T> Concatenate<T>(params IEnumerable<T>[] List) 
{ 
    foreach (IEnumerable<T> element in List) 
    { 
     foreach (T subelement in element) 
     { 
      yield return subelement; 
     } 
    } 
} 
相關問題