Preferisco di gran lunga questo tipo di struttura. Mantenendo un singolo elenco (si consiglia di utilizzare un dizionario o simile per velocità) di articoli e passandolo nella funzione GetChildItems si ha maggiore flessibilità e facilità di ordinamento, aggiunta, rimozione, salvataggio in un db ecc.
Hai davvero bisogno della funzione GetChildItem solo quando esegui il rendering dell'elenco su una vista e vuoi che la struttura ad albero sia facilmente modificabile come dici tu. In questo caso si può avere un modello di visualizzazione con l'elenco completo e la voce che è passato in ogni vista voce
public class Item
{
public string Id { get; set; }
public string ParentId { get; set; }
public IEnumerable<Item> GetChildItems(List<Item> allItems)
{
return allItems.Where(i => i.Id == this.ParentId);
}
}
public class Tree
{
public List<Item> Items { get; set; }
public IEnumerable<Item> RootItems(List<Item> allItems)
{
return allItems.Where(i => i.ParentId == null);
}
}
Nota: la struttura di classe di cui sopra è stato progettato per imitare il modello oggetto complesso tradizionale. in questi giorni si verificherebbe solo GetChildItems (Elenca tutti gli elementi, Oggetto genitore) nel modello di vista
I genitori vengono prima dei bambini nell'elenco? –
Mi piacerebbe esaminarlo. Non hanno davvero lavorato sugli alberi però. –