Я предпочитаю такую структуру. Поддерживая единый список (вы можете использовать словарь или аналогичный по скорости) элементов и передавая его в функцию GetChildItems, вы получаете большую гибкость и простоту сортировки, добавления, удаления, сохранения в БД и т. Д.
Вам действительно нужна функция GetChildItem, только когда вы отображаете список в виде, и вы хотите, чтобы древовидная структура была удобной для редактирования, как вы говорите. В этом случае вы можете иметь модель представления с полным списком и элементом, который передается в представление каждого элемента
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);
}
}
Примечание: приведенная выше структура класса разработана для имитации традиционного шаблона сложных объектов. в эти дни вы могли бы просто иметь GetChildItems (List allItems, Item parentItem) в модели представления