2014-11-21 12 views
9

Ich versuche, eine Methode zu implementieren, um mehrere Listen zu erstellen, z.Verkettung mehrerer 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); 

aber meine Methode nicht funktioniert:

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

Aufruf IEnumerable.Count() bei jedem Zyklus ist ein bisschen eine Verschwendung. Rufen Sie es einmal auf und speichern Sie es in einer Variablen, oder besser, verwenden Sie eine foreach-Schleife: 'var Temp = List.First(); foreach (IEnumerable Sequenz in List.Skip (1)) Temp = Enumerable.Concat (Sequenz); '. –

Antwort

44

Verwendung SelectMany:

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

Wenn Sie Ihre Funktion arbeiten Sie eine Reihe von IEnumerable brauchen machen wollen:

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

Der Parameter 'List' ist ein Array von IEnumerables und kann keine Elemente enthalten. Dies bewirkt, dass 'List.First()' eine Ausnahme auslöst. Sie sollten zuerst die Länge dieses Arrays überprüfen. Ich werde auch die Eigenschaft 'Length' und den Indexer' List [] 'anstelle der entsprechenden Linq-Erweiterungen in der for-Schleife verwenden. –

+0

Verwenden Sie keinen allgemeinen Klassennamen als Variablennamen. = ( – jpmc26

0

Alles, was Sie tun müssen zu ändern ist:

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

zu

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

Hinweis die extra [].

1

Nur der Vollständigkeit halber ich einen anderen Ansatz gefunden:

public static IEnumerable<T> Concatenate<T>(params IEnumerable<T>[] List) 
{ 
    foreach (IEnumerable<T> element in List) 
    { 
     foreach (T subelement in element) 
     { 
      yield return subelement; 
     } 
    } 
} 
Verwandte Themen