列表&子列表数据结构

时间:2017-11-01 20:39:40

标签: c# data-structures nested-lists

我正在尝试构建一个有很多输入的工程应用程序。

例如用户输入用于构造的材料并且必须描述它们的规格但每个项目具有不同的规格和技术数据,因此我尝试在下面的图像中创建具有以下结构的嵌套列表系统

enter image description here

enter image description here

如图所示,我试图使列表动态化,以便添加和删除新列表。

我将使用C#作为我的接口,使用SQL服务器作为我的数据库

但我坚持这样一个列表的数据结构。

2 个答案:

答案 0 :(得分:1)

听起来你正在寻找树状结构。链接列表是一个很好的方式来解决这个问题。在.NET中有一个现成的LinkedList结构,但我更喜欢自己编写,因为你需要的通常是它的最小版本。

class Node
{
    Dictionary<string, Node> SubLists { get; set; }
    public List<string> Items { get; set; }
}

对于每个子列表,您可以附加项目(如果是最终的)或新的节点列表,其中每个子节点可以再次具有要在树下进一步的节点列表,或者具有项目并且是最终的。这类似于操作系统中的目录的工作原理(不完全相同,但想法相似)

有关详细信息,您可以对链接列表进行一些后续阅读,它们是基本数据结构,因此记录在许多在线资源中。

通过将文档作为JSON存储在nvarchar(MAX)字段中,可以很容易地解决SQL问题。

答案 1 :(得分:1)

也许这样的事情对你来说在C#方面是有用的。

    public class Option
    {
        public string Name { get; set; }

        /// <summary>
        /// Used to treat the sub options as seperate properties rather than 
        /// options for this property.
        /// </summary>
        public bool IsCategory { get; set; }

        /// <summary>
        /// Lists of available options for this property, or sub properties
        /// for this property if `IsCategory` is true.
        /// </summary>
        public List<Option> Options { get; set; }

        /// <summary>
        /// If `IsCategory` is false, indicates the selected option for this property.
        /// </summary>
        public Option SelectedOption { get; set; }

        public Option(string name, bool isCategory)
        {
            Name = name;
            IsCategory = isCategory;
            Options = new List<Options>();
        }
    }

    public void Example()
    {
        Option pipes = new Option("Pipes", true);
        Option material = new Option("Material", false);
        Option size= new Option("Size", false);

        Option blackSteel = new Option("Black Steel", true);
        Option stainlessSteel = new Option("Stainless Steel", true);
        Option schedule = new Option("Schedule", false);

        schedule.Options.Add(new Option("10", false));
        schedule.Options.Add(new Option("20", false));
        schedule.Options.Add(new Option("40", false));
        schedule.Options.Add(new Option("80", false));

        blackSteel.Options.Add(schedule);
        stainlessSteel.Options.Add(schedule);

        material.Options.Add(blackSteel);
        material.Options.Add(stainlessSteel);
        pipes.Options.Add(material);
        pipes.Options.Add(size);
    }

在SQL方面,您可以通过为每个选项提供唯一索引来定义这些选项,从而形成如下表:

+---------+-----------------+---------------------+------------------+
| ID<INT> | NAME<VARCHAR>   | ISCATEGORY<BOOLEAN> | OPTIONS<VARCHAR> |
+---------+-----------------+---------------------+------------------+
| 0       | Pipes           | true                | 1,2              |
| 1       | Material        | false               | 3,4              |
| 2       | Size            | false               |                  |
| 3       | Black Steel     | true                | 5                |
| 4       | Stainless Steel | true                | 5                |
| 5       | Schedule        | false               | 6,7,8,9          |
| 6       | 10              | false               |                  |
| 7       | 20              | false               |                  |
| 8       | 30              | false               |                  |
| 9       | 40              | false               |                  |
+---------+-----------------+---------------------+------------------+