Cómo "desenrollar" una estructura "recursiva"

No estoy seguro de cómo llamarlo, pero di que tienes una clase que se parece a esto:

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

Luego tiene una persona y desea "desenrollar" esta estructura de manera recursiva para que termine con una lista única de todas las personas sin duplicados.

¿Cómo harías esto? Ya he hecho algo que parece estar funcionando, pero tengo curiosidad por ver cómo lo harían los demás y, especialmente, si hay algo integrado en Linq que puedes usar de una manera inteligente para resolver este pequeño problema :)

Aquí está mi solución:

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;
    }
}

Se usaría algo como esto:

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

Respuestas a la pregunta(6)

Su respuesta a la pregunta