Como "desenrolar" uma estrutura "recursiva"

Não sei como chamá-lo, mas diga que você tem uma classe que se parece com isso:

class Person
{
    public string Name;
    public IEnumerable<Person> Friends;
}

Então, você tem uma pessoa e deseja "desenrolar" essa estrutura de forma recursiva, de modo que acabe com uma única lista de todas as pessoas sem duplicatas.

Como você faria isso? Eu já fiz algo que parece estar funcionando, mas estou curioso para ver como os outros o fariam e especialmente se há algo embutido no Linq que você pode usar de uma maneira inteligente para resolver este pequeno problema :)

Aqui está a minha solução:

public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> subjects, Func<T, IEnumerable<T>> selector)
{
    // Stop if subjects are null or empty
    if(subjects == null)
        yield break;

    // For each subject
    foreach(var subject in subjects)
    {
        // Yield it
        yield return subject;

        // Then yield all its decendants
        foreach (var decendant in SelectRecursive(selector(subject), selector))
            yield return decendant;
    }
}

Seria usado algo assim:

var people = somePerson.SelectRecursive(x => x.Friends);

questionAnswers(6)

yourAnswerToTheQuestion