Dntdothis Ответов: 1

Структура данных(дерево) с несколькими классами


Я побежал к проблеме, у меня есть задача с категориями и элементами, мне нужно сделать список дерева меню, он может быть N глубоким, родитель может иметь много детей, как он хочет:

Дерево меню выглядит следующим образом:

- Category (6)
    - Category (3)
      - Item (€0.50)
      - Category (2)
        - Item (€1.10)
        - Item (€6.25)
      -Category (1)
        - Item (€3.33)
    - Category (2)
      - Item (€1.10)
      - Item (€9.99)
    - Category (0)
- Category (2)
    - Category (1)
        - Item (€0.50)
    -Category (1)
        - Item (€0.60)


Элемент может иметь свойства - имя, активный, цена. Категория может иметь - имя, активный.

Так что, может быть, у меня есть какие-нибудь предложения, какое дерево я должен использовать ? Нужно ли мне создавать 2 таблицы для этого дерева, потому что, на мой взгляд, категория ничего не должна знать о цене, а также, возможно, сделать товар открытым для новых изменений, например добавления новых полей.

Что я уже пробовал:

Я провел только одно исследование и подумал, что смогу найти мнение, которое, возможно, сделало что-то подобное или имеет какое-то представление о том, какую структуру данных мне следует использовать.

BillWoodruff

Это проект WinForms ? Когда вы говорите "меню", вы имеете в виду, что есть какой-то визуальный интерфейс, который является частью этого ?

Вы написали какой-нибудь код ?

"создайте 2 таблицы для этого дерева" вы говорите здесь о таблице базы данных ?

Dntdothis

Да, 2 таблицы, ну я же не писал никакого кода, так как хочу иметь четкое видение, как это сделать со стороны архитектуры.

BillWoodruff

Действительно ли узел элемента всегда будет конечным узлом, то есть он никогда не будет содержать других узлов ? Именно такую структуру показывает сейчас ваш код.

Dntdothis

Да, это как продукт с ценой, так что он не будет содержать детей

1 Ответов

Рейтинг:
11

BillWoodruff

Зная, что твое дерево пункт узлы всегда являются листовыми узлами a конкретный тип это немного упрощает вашу задачу. Я собираюсь опубликовать эскиз структуры, которая будет реализовывать дерево этого типа, которое, как я знаю, работает. Я говорю "эскиз", потому что моя цель-помочь вам в развитии ваших навыков программирования ... поэтому я оставляю ключевые фрагменты кода для вас, чтобы вы могли их проработать.

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)
        {
            // what happens here ?
        }
    }

    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)
        {
             // what happens here ?
        }

        public void AddMenuItem(MenuTreeItem itm)
        {
             // what happens here ?
        }
    }

    public class MenuTreeItem : IMenu
    {
        public MenuTreeItem(string name, double price,  bool isActive = true)
        {
            // what happens here ?
        }

        // see note #1
        public Category MItemCategory { get; set; }

        // what other Fields or Properties must be defined ?
    }
}
Если бы этот код был полный, его можно было бы использовать вот так:
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));
    }
}
примечание № 1: Должна ли ссылка на категорию элемента передаваться в конструкторе элемента, а не задаваться методом AddMenuItem категории ?


Dntdothis

Большое вам спасибо, сэр! Обязательно разберусь с этим! Я буду держать вас в курсе событий, еще раз спасибо!

Maciej Los

Ух ты!
5ed!

BillWoodruff

спасибо, Мацей !