Knowing your tree's
item nodes are always leaf nodes of a
specific type makes your task a bit simpler. I'm going to post a sketch of a structure that will implement a tree of this type which I know works. I say "sketch" because my goal is to assist you in developing your programming skills ... so, I am leaving key pieces of the code out for you to work out.
using System.Collections.Generic;
namespace YourNameSpace
{
{
public interface IMenu
{
string Name { get; set; }
bool IsActive { get; set; }
}
public class MenuTree
{
public MenuTree(string name)
{
Name = name;
Categories = new List<Category>();
}
string Name { get; set; }
List<Category> Categories { get; set; }
public Category AddCategory(Category cat)
{
}
}
public class Category : IMenu
{
public Category(string name, bool isActive = true)
{
Name = name;
IsActive = isActive;
MenuItems = new List<MenuTreeItem>();
Categories = new List<Category>();
}
public string Name { get; set; }
public bool IsActive { get; set; }
public List<Category> Categories { get; set; }
public List<MenuTreeItem> MenuItems { get; set; }
public Category AddCategory(Category cat)
{
}
public void AddMenuItem(MenuTreeItem itm)
{
}
}
public class MenuTreeItem : IMenu
{
public MenuTreeItem(string name, double price, bool isActive = true)
{
}
public Category MItemCategory { get; set; }
}
}
If this code were
complete, it could be used like this:
MenuTree mTree = new MenuTree("TestMenuTree");
int id = 1;
for (int i = 0; i < 5; i++)
{
Category cat1 = mTree.AddCategory(new Category($"Cat_{i}"));
for (int j = 0; j < 3; j++)
{
cat1.AddMenuItem(new MenuTreeItem($"mi_{id++}", (j * 11.11) + 22));
}
Category cat2 = cat1.AddCategory(new Category($"Cat_{i}_A"));
for (int j = 0; j < 3; j++)
{
cat2.AddMenuItem(new MenuTreeItem($"mi_{id++}", (j * 23.45) + 56.45));
}
}
note #1: Should the reference to the Item's 'Category be passed in the Item's constructor rather than be set by the 'AddMenuItem method of the Category ?