2009-02-08 17 views
19

¿Hay una manera incorporada simple de tomar una lista ordenada de IEnumerable sy devolver un solo IEnumerable que produce, en orden, todos los elementos en el primero, luego el segundo, y así sucesivamente.Encadenando IEnumerables en C#?

no me resultaba difícil escribir mi propio, pero quería saber si ya había una manera de lograr esta tarea aparentemente útil antes de hacerlo.

Respuesta

24

Pruebe SelectMany.

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

El propósito de esta función es para aplanar un grupo de IEnumerable < IEnumerable <T> > en un IEnumerable <T>. Los datos devueltos conservarán el orden original.

15

con la respuesta de JaredPar (correcta) - también la sintaxis de consulta:

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

En relación con las respuestas basadas en LINQ (correctas) ...

Si no desea utilizar LINQ, usted puede inventar una clase ChainedEnumerable que el rendimiento en:

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(); 
    } 
} 

utilizar de esta manera:

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 Esta es una solución agradable y ordenada. ¡Creo que lo incorporaré en mis cosas! –

Cuestiones relacionadas