2009-02-08 18 views
19

Esiste un modo semplice incorporato per prendere un elenco ordinato di IEnumerable s e restituire un singolo IEnumerable che restituisce, nell'ordine, tutti gli elementi nel primo, poi il secondo e così via.Concatenamento di oggetti enumerabili in C#?

Potrei sicuramente scrivere il mio, ma volevo sapere se c'era già un modo per realizzare questo compito apparentemente utile prima di farlo.

risposta

24

Prova SelectMany.

IEnumerable<int> Collapse(IEnumerable<IEnumerable<int>> e){ 
return e.SelectMany(x => x); 
} 

Lo scopo di questa funzione è quello di appiattire un gruppo di IEnumerable IEnumerable < <T> > in un IEnumerable <T>. I dati restituiti conserveranno l'ordine originale.

15

A seguito (corretto) La risposta di JaredPar - anche interrogare sintassi:

var all = from inner in outer 
      from item in inner 
      select item; 
12

Oltre alle (corrette) risposte LINQ-based ...

Se non si desidera utilizzare LINQ, si può inventare una classe ChainedEnumerable, dalla resa:

public class ChainedEnumerable<T> : IEnumerable<T> 
{ 
    private readonly IEnumerable<T>[] _inners; 

    public ChainedEnumerable(params IEnumerable<T>[] inners) 
    { 
     _inners = inners; 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     foreach (IEnumerable<T> inner in _inners) 
     { 
      foreach (T t in inner) 
      { 
       yield return t; 
      } 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

usare in questo modo:

List<string> a = new List<string> { "A1", "A2", "A3" }; 
List<string> b = new List<string> { "B1", "B2", "B3" }; 
ChainedEnumerable<string> chainedEnumerable = 
    new ChainedEnumerable<string>(a, b); 
foreach (string s in chainedEnumerable) 
    Console.WriteLine(s); 
+0

+1 Questa è una soluzione carina e ordinata. Credo che lo inserirò nelle mie cose! –

Problemi correlati