
Originariamente inviata da
Scara95
Certo che in realtà scorri tutta la lista un numero impressionante di volte per il compito da risolvere e ci sono soluzioni possibili in 2 passaggi (e una struttura di supporto).
Vero è anche che in generale, per le dimensioni di un menù, non si presenterà alcun problema e non c'è gran spreco di risorse.
Ovviamente concordo su entrambe le considerazioni, era più che altro per rendere l'idea. La soluzione più corretta probabilmente sarebbe una multimap (parentID -> (ID, Nome)), in cui l'accesso agli elementi desiderati è O(1).
codice:
string buildMenu(Element elem[])
{
Dictionary<int, List<Element> > d;
foreach(Element e in elem)
{
if(!d.ContainsKey(e.parentID))
d[parentID]=new List<Element>();
d[parentID].Add(e);
}
StringBuilder sb;
buildItems(d, 0, sb);
return sb.toString();
}
void buildItems(Dictionary<int, List<Element> > d, int parentID, StringBuilder sb)
{
sb.Append("<ul>");
List<Element> l = d[parentID];
foreach(Element e: l)
{
sb.Append("<li>");
sb.Append(e.name);
buildItems(d, e.ID, sb);
sb.Append("</li>");
}
sb.Append("</ul>");
}