Рассмотрим следующий метод расширения в C#, траверс:Функционально обхода дерева в C#
IEnumerable<T> Traverse<T>(this IEnumerable<T> source,
Func<T, IEnumerable<T>> fnRecurse);
Этот метод позволяет рекурсию через дерево, как это определено Т и независимо от функции вызывает Т вернуть его подузлов.
Теперь рассмотрим следующую реализацию Т:
class Node
{
public string Name;
public List<Node> Children;
}
Моя цель состоит в том, чтобы написать самую короткую функцию, возможно, что будет возвращать IEnumerable , содержащий полные пути для каждого узла в этом дереве. Что-то вроде:
var node = GetParentNode();
return node.Traverse(node => node.Children)
.Select(node => GetParentName(node) + ":" + node.Name);
Очевидно, что добавление родительского свойства к узлу делает проблему тривиальной. Вместо этого я хотел бы как-то построить мои родительские строки внутри функтора. Я не думаю, что это было бы слишком сложно в C++, но я не вижу, как это сделать на C#. Есть идеи?
Я просто набрав в точно такой же ответ :) (за исключением вам не нужно «С» в C# :) –
@Tony, хороший улов на с. Работа на 4-х языках каждый день не подходит для согласованных ответов SO :) – JaredPar
@Tony, комментарии в стиле Twitter для вас будут выглядеть ужасно смешно, когда вы вернетесь к Jon – JaredPar