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