2014-11-21 16 views
9

Sto tentando di implementare un metodo per organizzare più elenchi, ad es.Concatenare più 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); 

ma il mio metodo non funziona:

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

Calling IEnumerable.Count() ogni ciclo è un po 'uno spreco. Chiamalo una volta e memorizzalo in una variabile, o meglio usa un ciclo foreach: 'var Temp = List.First(); foreach (IEnumerable sequence in List.Skip (1)) Temp = Enumerable.Concat (sequence); '. –

risposta

44

Uso SelectMany:

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

Se volete rendere il vostro lavoro funzione è necessario un array di 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

Il parametro 'List' è un array di IEnumerables e potrebbe non contenere elementi. Ciò causerà 'List.First()' per generare un'eccezione. Dovresti prima controllare la lunghezza di questo array. Userò anche la proprietà 'Length' e l'indexer' List [] 'invece delle estensioni Linq equivalenti nel ciclo for. –

+0

Non utilizzare un nome di classe comune come nome di variabile. = ( – jpmc26

0

Tutto quello che devi fare è quello di cambiare:

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

a

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

nota l'extra [].

1

Solo per completezza ho trovato un altro approccio:

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