В С#, как я могу выполнить поиск в списке иерархии, а также сохранить путь в конце. Например:
Объект
public class Node
{
public IEnumerable<Node> Children { get; set; }
public string Id { get; set; }
}
Результат
- a
- aa
- aaa
- ааб
- aa
- b
- ba
- bb
- bba
Что я хочу
Если я ищу в этом списке слово «aab», я хотел бы показать этот результат клиенту:
- a
- aa
- aab
- aa
Одна реализация, которую я нашел для поиска в списке иерархии, взята там https://stackoverflow.com/a/30907231/316759 но проблема в том, что он возвращает только найденные конечные узлы без сохранения иерархической структуры.
public static T DepthFirstSearch<T, TChilds>(this T node, Func<T, TChilds> ChildsProperty, Predicate<T> Match) where T : class
{
Stack<T> stack = new Stack<T>();
stack.Push(node);
while (stack.Count > 0)
{
T thisNode = stack.Pop();
if (Match(thisNode))
{
return thisNode;
}
if (ChildsProperty(thisNode) != null)
{
foreach (T child in (ChildsProperty(thisNode) as IEnumerable<T>).Reverse())
{
stack.Push(child);
}
}
}
return null;
}
Что мне нужно, так это найти листовые узлы и сохранить их родителей в корне.