Мне часто приходится обходить деревья иерархических объектов и выполнять операции с каждым элементом на этом пути. Есть ли общепринятое название для такого рода операции в языке понимания списков? Я спрашиваю, потому что помню, как впервые узнал о функции zip в python еще до того, как у нее был эквивалент в платформе .net, и подумал, что у нее необычное, но подходящее имя.
Вот пара обобщенных методов, которые рекурсивно повторяются. вверх и вниз по древовидной структуре и выдают каждый элемент по мере того, как они встречаются.
public static IEnumerable Ancestors(T source, Func selector)
{
do
{
yield return source;
source = selector(source);
} while (!Equals(source, default(T)));
}
public static IEnumerable Descendents(T source,
Func> selector)
{
var stack = new Stack();
stack.Push(source);
while (stack.Count > 0)
{
source = stack.Pop();
yield return source;
var items = selector(source);
if (items != null)
{
foreach (var item in items)
{
stack.Push(item);
}
}
}
}