Quote Originariamente inviata da MItaly Visualizza il messaggio
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);
        sb.Append("</li>");
    }
    sb.Append("</ul>");
}
Proprio di questo parlavo, l'avrei scritto io se ne avessi avuto il tempo. Tuttavia manca comunque parte della soluzione, una chiamata ricorsiva ci vuole comunque...
(Ed ecco che perché le cose vanno scritte oltre che pensate, avevo tralasciato questo dettaglio)
Resta comunque più efficiente.