A menudo me resulta necesario atravesar árboles de objetos jerárquicos y realizar operaciones en cada elemento a lo largo del camino. ¿Existe un nombre generalmente aceptado para este tipo de operación en la lista de comprensión vernácula? Lo pregunto porque recuerdo haber aprendido por primera vez acerca del zip function de python antes de que tuviera un equivalente en el framework .net y pensar que tenía un nombre inusual pero apropiado.¿Hay un nombre aceptado para este tipo de operación enumerable?
Aquí hay un par de métodos generalizados que recurren arriba y abajo de las estructuras de los árboles y producen cada elemento a medida que se encuentran.
public static IEnumerable<T> Ancestors<T>(T source, Func<T, T> selector)
{
do
{
yield return source;
source = selector(source);
} while (!Equals(source, default(T)));
}
public static IEnumerable<T> Descendents<T>(T source,
Func<T, IEnumerable<T>> selector)
{
var stack = new Stack<T>();
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);
}
}
}
}
Algún tipo de recorrido de árbol filtrado? No sé si esto tiene un nombre en particular. Yo no creo que tenga. –
El segundo está haciendo una búsqueda en profundidad. No estoy seguro de que el segundo nombre tenga un nombre, ya que aunque se llame 'Antepasados' dependiendo de la función del selector, no necesita seguir realmente al 'padre' (por ejemplo, podría hacer cualquier cosa, por ejemplo, seleccionar un 'mejor' hijo nodo) –
@George: Exactamente, 'Ancestros' implica cierto tipo de relación jerárquica. En realidad, podría usarse fácilmente para atravesar una lista doblemente enlazada en cualquier dirección o seguir cualquier tipo de camino arbitrario. –