Wie man eine "rekursive" Struktur "ausrollt"

Ich weiß nicht, wie ich es nennen soll, aber ich sage, Sie haben eine Klasse, die so aussieht:

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

Sie haben dann eine Person und möchten diese Struktur rekursiv "auflösen", sodass Sie eine einzige Liste aller Personen ohne Duplikate erhalten.

Wie würdest du das machen? Ich habe bereits etwas gemacht, das zu funktionieren scheint, aber ich bin gespannt, wie andere es tun würden, und vor allem, wenn Linq etwas eingebaut hat, mit dem Sie dieses kleine Problem auf clevere Weise lösen können :)

Hier ist meine Lösung:

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

Wäre so etwas verwendet:

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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage