Często potrzebuję przechodzić drzewa hierarchicznych obiektów i wykonywać operacje na każdym z elementów po drodze. Czy istnieje ogólna akceptowana nazwa tego rodzaju operacji w języku zrozumiałym dla listy? Pytam, ponieważ pamiętam, że najpierw dowiedziałem się o Pythonie zip function, zanim miał on odpowiednik w strukturze .net i myślał, że ma nietypową, ale odpowiednią nazwę.Czy istnieje akceptowana nazwa dla tego rodzaju operacji przeliczalnych?
Oto kilka ogólnych metod rekurencyjnych w górę i w dół struktur drzewa i przynosi każdy z nich w miarę ich napotykania.
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);
}
}
}
}
Jakiś rodzaj przefiltrowanego drzewa ruchu? Nie wiem, czy to ma konkretną nazwę. Nie sądzę, że tak. –
Druga wykonuje wyszukiwanie głębi-pierwszego. Nie jestem pewien, czy druga nazwa ma nazwę, ponieważ chociaż jest nazywana "przodkami" w zależności od funkcji selektora, nie musi w ogóle podążać za "rodzicem" (np. Może zrobić wszystko, np. Wybrać "najlepsze" dziecko node) –
@George: Dokładnie, 'Przodkowie' oznacza pewien rodzaj hierarchicznej relacji. W rzeczywistości można go z łatwością wykorzystać do przechodzenia w podwójnie połączoną listę w dowolnym kierunku lub dowolną dowolną ścieżkę. –