Поиск в дереве с использованием LINQ

У меня есть дерево, созданное из этого класса.

class Node
{
    public string Key { get; }
    public List<Node> Children { get; }
}

Я хочу выполнить поиск во всех дочерних элементах и ​​всех их дочерних элементах, чтобы найти те, которые соответствуют условие:

node.Key == SomeSpecialKey

Как я могу это реализовать?

82
задан Ufuk Hacıoğulları 20 August 2013 в 10:42
поделиться

1 ответ

И только для забавы (почти десятилетие спустя) ответ также с помощью Дженериков, но со Стеком и Циклом с условием продолжения, базирующимся от принятого ответа @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);
0
ответ дан 24 November 2019 в 09:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: