Si consideri il seguente metodo di estensione in C#, Traverse:Funzionalmente attraversare un albero in C#
IEnumerable<T> Traverse<T>(this IEnumerable<T> source,
Func<T, IEnumerable<T>> fnRecurse);
Questo metodo permette la ricorsione attraverso un albero, come definito da T e qualsiasi funzione causa T per tornare i suoi sottonodi.
Consideriamo ora il seguente implementazione di T:
class Node
{
public string Name;
public List<Node> Children;
}
Il mio obiettivo è quello di scrivere la più breve possibile funzione che restituirà un IEnumerable contenente i percorsi completi per ogni nodo in questo albero. Qualcosa di simile:
var node = GetParentNode();
return node.Traverse(node => node.Children)
.Select(node => GetParentName(node) + ":" + node.Name);
Ovviamente, l'aggiunta di una proprietà Parent al nodo rende il problema banale. Invece mi piacerebbe costruire le mie stringhe madri all'interno di un functor in qualche modo. Non penso che sarebbe troppo difficile in C++, ma non vedo come farlo in C#. Qualche idea?
stavo scrivendo nella stessa identica risposta :) (Tranne che non è necessario "con" in C# :) –
@Tony, buona pesca sul con. Lavorare in 4 lingue ogni giorno non va bene per le risposte SO coerenti :) – JaredPar
@Tony, i commenti in stile twitter ti sembreranno terribilmente divertenti quando torni a Jon – JaredPar