Перечисление IEnumerables в С#?
Есть ли простой встроенный способ взять упорядоченный список IEnumerable
и вернуть один IEnumerable
, который дает, по порядку, все элементы в первом, затем втором и т.д.
Я мог бы, конечно, написать свой собственный, но я хотел знать, есть ли способ выполнить эту, казалось бы, полезную задачу, прежде чем я это сделаю.
Ответы
Ответ 1
Попробуйте выбратьMany.
IEnumerable<int> Collapse(IEnumerable<IEnumerable<int>> e){
return e.SelectMany(x => x );
}
Цель этой функции - сгладить группу IEnumerable < IEnumerable <T → в IEnumerable <T> . Возвращенные данные сохранят первоначальный порядок.
Ответ 2
В дополнение к JaredPar (правильный) ответ - также синтаксис запроса:
var all = from inner in outer
from item in inner
select item;
Ответ 3
В дополнение к (правильным) 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);