Sie können einen Baum wie folgt abflachen:
IEnumerable<MyNode> Flatten(IEnumerable<MyNode> e) =>
e.SelectMany(c => Flatten(c.Elements)).Concat(new[] { e });
Anschließend können Sie filtern , indem Sie group
mit Where(...)
.
Konvertieren Sie Flatten
in eine Erweiterungsfunktion in einer statischen Klasse, um einige "Punkte für Stil" zu erhalten.
public static IEnumerable<MyNode> Flatten(this IEnumerable<MyNode> e) =>
e.SelectMany(c => c.Elements.Flatten()).Concat(e);
Um mehr Punkte für einen "noch besseren Stil" zu erhalten, konvertieren Sie Flatten
in eine generische Erweiterungsmethode, die einen Baum und eine Funktion verwendet, die Nachkommen von einem Knoten erzeugt:
public static IEnumerable<T> Flatten<T>(
this IEnumerable<T> e
, Func<T,IEnumerable<T>> f
) => e.SelectMany(c => f(c).Flatten(f)).Concat(e);
Rufen Sie diese Funktion folgendermaßen auf:
IEnumerable<MyNode> tree = ....
var res = tree.Flatten(node => node.Elements);
Wenn Sie das Abflachen lieber in der Vorbestellung als in der Nachbestellung bevorzugen, wechseln Sie die Seiten des Concat(...)
.