É 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.

questionAnswers(2)

yourAnswerToTheQuestion