У меня есть дерево, созданное из этого класса.
class Node
{
public string Key { get; }
public List<Node> Children { get; }
}
Я хочу выполнить поиск во всех дочерних элементах и всех их дочерних элементах, чтобы найти те, которые соответствуют условие:
node.Key == SomeSpecialKey
Как я могу это реализовать?
И только для забавы (почти десятилетие спустя) ответ также с помощью Дженериков, но со Стеком и Циклом с условием продолжения, базирующимся от принятого ответа @vidstige.
public static class TypeExtentions
{
public static IEnumerable<T> Descendants<T>(this T root, Func<T, IEnumerable<T>> selector)
{
var nodes = new Stack<T>(new[] { root });
while (nodes.Any())
{
T node = nodes.Pop();
yield return node;
foreach (var n in selector(node)) nodes.Push(n);
}
}
public static IEnumerable<T> Descendants<T>(this IEnumerable<T> encounter, Func<T, IEnumerable<T>> selector)
{
var nodes = new Stack<T>(encounter);
while (nodes.Any())
{
T node = nodes.Pop();
yield return node;
if (selector(node) != null)
foreach (var n in selector(node))
nodes.Push(n);
}
}
}
, Учитывая набор можно использовать как это
var myNode = ListNodes.Descendants(x => x.Children).Where(x => x.Key == SomeKey);
или с корневым объектом
var myNode = root.Descendants(x => x.Children).Where(x => x.Key == SomeKey);