Как мы все знаем, Enumerable.SelectMany
выравнивает последовательность последовательностей в одну последовательность. Что, если мы хотим получить метод, который мог бы сгладить последовательности последовательностей последовательностей и т.д. Рекурсивно?
Я быстро придумал реализацию с использованием ICollection<T>
, то есть с нетерпением оцененной, но я все еще почесываю голову о том, как сделать лениво оцененную, скажем, с помощью ключевого слова yield
.
static List<T> Flatten<T>(IEnumerable list) {
var rv = new List<T>();
InnerFlatten(list, rv);
return rv;
}
static void InnerFlatten<T>(IEnumerable list, ICollection<T> acc) {
foreach (var elem in list) {
var collection = elem as IEnumerable;
if (collection != null) {
InnerFlatten(collection, acc);
}
else {
acc.Add((T)elem);
}
}
}
Любые идеи? Примеры в любом приветствии .NET.