Цепочки IEnumerables в C #? - PullRequest
       11

Цепочки IEnumerables в C #?

19 голосов
/ 08 февраля 2009

Существует ли простой встроенный способ взять упорядоченный список IEnumerable s и вернуть один IEnumerable, который возвращает по порядку все элементы в первом, затем во втором и т. Д.

Я, конечно, мог написать свою собственную, но я хотел знать, есть ли способ решить эту, казалось бы, полезную задачу, прежде чем я это сделаю.

Ответы [ 3 ]

24 голосов
/ 08 февраля 2009

Попробуйте SelectMany.

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

Цель этой функции - объединить группу IEnumerable > в IEnumerable . Возвращенные данные сохранят исходный порядок.

15 голосов
/ 08 февраля 2009

В дополнение к (правильному) ответу JaredPar - также синтаксис запроса:

var all = from inner in outer
          from item in inner
          select item;
12 голосов
/ 08 февраля 2009

В дополнение к (правильным) ответам на основе LINQ ...

Если вы не хотите использовать LINQ, вы можете изобрести класс ChainedEnumerable, используя yield:

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

Используйте это так:

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);
...