É possível implementar um "SelectMany" recursivo?
Como todos sabemos,Enumerable.SelectMany
nivela uma seqüência de seqüências em uma única seqüência. E se quiséssemos um método que pudesse achatar seqüências de seqüências de seqüências, e assim por diante recursivamente?
Eu vim rapidamente com uma implementação usando umICollection<T>
, avidamente avaliou, mas ainda estou coçando minha cabeça sobre como fazer uma avaliação preguiçosa, digamos, usando oyield
palavra chave.
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);
}
}
}
Alguma ideia? Exemplos em qualquer linguagem .NET bem-vinda.