C# 名单及;子列表数据结构
我正在尝试构建一个具有大量输入的工程应用程序 e、 g.用户输入用于施工的材料,并且必须描述其规格,但每个项目都有不同的规格和技术数据,因此我尝试制作一个嵌套列表系统,该系统在下图中具有以下结构 如图所示,我正在尝试使列表动态化,以便可以添加和删除新列表 我将使用C#作为我的界面,使用SQL server作为我的数据库C# 名单及;子列表数据结构,c#,data-structures,nested-lists,C#,Data Structures,Nested Lists,我正在尝试构建一个具有大量输入的工程应用程序 e、 g.用户输入用于施工的材料,并且必须描述其规格,但每个项目都有不同的规格和技术数据,因此我尝试制作一个嵌套列表系统,该系统在下图中具有以下结构 如图所示,我正在尝试使列表动态化,以便可以添加和删除新列表 我将使用C#作为我的界面,使用SQL server作为我的数据库 但我一直在使用这样一个列表的数据结构。听起来像是在寻找一个树结构。链表是一种很好的方法。NET中有一个现成的LinkedList结构,但我更喜欢自己编写,因为您需要的通常是它
但我一直在使用这样一个列表的数据结构。听起来像是在寻找一个树结构。链表是一种很好的方法。NET中有一个现成的LinkedList结构,但我更喜欢自己编写,因为您需要的通常是它的最小版本
class Node
{
Dictionary<string, Node> SubLists { get; set; }
public List<string> Items { get; set; }
}
类节点
{
字典子列表{get;set;}
公共列表项{get;set;}
}
对于每个子列表,您可以附加项目(如果是最终的),也可以添加新的节点列表,其中每个子列表都可以有一个节点列表,以便在树中进一步向下移动,或者有项目并且是最终的。这与操作系统中的目录工作原理类似(不完全相同,但想法类似)
要了解更多信息,您可以对链表进行后续阅读,它们是一种基本的数据结构,因此记录在许多在线资源中
通过将文档作为JSON存储在nvarchar(MAX)字段中,可以很容易地解决SQL问题 听起来你在寻找一个树形结构。链表是一种很好的方法。NET中有一个现成的LinkedList结构,但我更喜欢自己编写,因为您需要的通常是它的最小版本
class Node
{
Dictionary<string, Node> SubLists { get; set; }
public List<string> Items { get; set; }
}
类节点
{
字典子列表{get;set;}
公共列表项{get;set;}
}
对于每个子列表,您可以附加项目(如果是最终的),也可以添加新的节点列表,其中每个子列表都可以有一个节点列表,以便在树中进一步向下移动,或者有项目并且是最终的。这与操作系统中的目录工作原理类似(不完全相同,但想法类似)
要了解更多信息,您可以对链表进行后续阅读,它们是一种基本的数据结构,因此记录在许多在线资源中
通过将文档作为JSON存储在nvarchar(MAX)字段中,可以很容易地解决SQL问题 也许像这样的事情对你在C#端会有用
公共类选项
{
公共字符串名称{get;set;}
///
///用于将子选项视为单独的属性,而不是
///此属性的选项。
///
公共布尔分类{get;set;}
///
///此属性或子属性的可用选项列表
///如果'IsCategory'为true,则为该属性。
///
公共列表选项{get;set;}
///
///如果“IsCategory”为false,则表示为此属性选择的选项。
///
公共选项选择选项{get;set;}
公共选项(字符串名称,布尔分类)
{
名称=名称;
IsCategory=IsCategory;
选项=新列表();
}
}
公共无效示例()
{
选项管道=新选项(“管道”,真);
选项材料=新选项(“材料”,假);
选项大小=新选项(“大小”,false);
选项黑钢=新选项(“黑钢”,正确);
选项不锈钢=新选项(“不锈钢”,正确);
选项计划=新选项(“计划”,false);
附表。选项。添加(新选项(“10”,假));
附表。选项。添加(新选项(“20”,假));
附表。选项。添加(新选项(“40”,假));
附表.选项.添加(新选项(“80”,假));
黑钢。选项。添加(附表);
不锈钢。选项。添加(明细表);
材料。选项。添加(黑钢);
材料。选项。添加(不锈钢);
管道。选项。添加(材质);
管道。选项。添加(尺寸);
}
在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 | |
+---------+-----------------+---------------------+------------------+
+---------+-----------------+---------------------+------------------+
|ID |名称|分类|选项|
+---------+-----------------+---------------------+------------------+
|0 |管道|正确| 1,2|
|1 |材料|虚假| 3,4|
|2 |尺寸|假||
|3 |黑钢|真| 5|
|4 |不锈钢|真| 5|
|5 |附表|假| 6,7,8,9|
|6 | 10 |假||
|7 | 20 |假||
|8 | 30 |假||
|9 | 40 |假||
+---------+-----------------+---------------------+------------------+
也许像这样的东西在C#端对你有用
公共类选项
{
公共字符串名称{get;set;}
///
///用于将子选项视为单独的属性,而不是
///此属性的选项。
///
公共布尔分类{get;set;}
///
///此属性或子属性的可用选项列表
///如果'IsCategory'为true,则为该属性。
///
公共列表选项{get;set;}
///
///如果“IsCategory”为false,则表示为此属性选择的选项。
///
公共选项选择选项{get;set;}
公共选项(字符串名称,布尔分类)