.net 将同一文件修订的列表分组,并建立它们之间的关系

.net 将同一文件修订的列表分组,并建立它们之间的关系,.net,vb.net,treeview,.net,Vb.net,Treeview,我尝试将那些具有相同根的文件修订进行分组,并在它们之间建立关系 例如: 1.17 1.17.1.1 1.17.1.2 1.17.1.2.1.1 1.17.2.1 1.17.2.2 1.18 1.19 现在,我想分组讨论 1.17, 1.18, 1.19 as the same group and make relationship is parent 1 1.17.1.1, 1.17.1.2 as the same group and make relationship is child 1.

我尝试将那些具有相同根的文件修订进行分组,并在它们之间建立关系

例如:

1.17
1.17.1.1
1.17.1.2
1.17.1.2.1.1
1.17.2.1
1.17.2.2
1.18
1.19
现在,我想分组讨论

1.17, 1.18, 1.19 as the same group and make relationship is parent 1
1.17.1.1, 1.17.1.2 as the same group and make relationship is child 1.1
1.17.2.1, 1.17.2.2 as the same group and make relationship is child 1.2
1.17.1.2.1.1 as the same group and make relationship is grandchild 1.1.1
我的想法是在列表中循环,试着找到按点分割的数字,然后将其与列表中的数字进行比较,但结果似乎不好

我不知道在VB.NET中有没有最好的方法来实现它

输出可能是一个数据表,其中包含每个数据行 索引修订关系 1 1.17, 1.18, 1.19 1 2 1.17.1.1, 1.17.1.2 1.1 3 1.17.2.1, 1.17.2.2 1.2 4 1.17.1.2.1.1 1.1.1.1

他们之间的关系 1.17、1.18、1.19(可能有1.20、1.21…)被分组为根组 1.17.1.1、1.17.1.2(可能有1.17.1.3、1.17.1.4…)被分组为根组的第一个子组 1.17.2.1、1.17.2.2(可能有1.17.2.3、1.17.2.4…)被分组为根组的第二个子组 1.17.1.2.1.1与第一个孩子组(1.17.1.1.x.y)具有相同路径的儿童被分组为第一个孩子组的第一个孙子组


我非常感谢您的帮助,非常感谢。

如果您想从修订列表中创建一个数据表,那么您可以使用相同的想法,对分组/关系问题进行一些更改

私有函数ToDataTable(revs As IEnumerable(字符串))作为DataTable
Dim dt作为新数据表
dt.Columns.Add(“Id”,GetType(Integer)).AutoIncrement=True
Add(“ParentId”,GetType(整数))
添加(“文本”,GetType(字符串))
Add(“路径”,GetType(字符串))
Add(“ParentPath”,GetType(String))
添加(“级别”,GetType(整数))
每个版本的订单修订(功能(x)x)
Dim arr=Regex.Matches(修订版“\d+\。\d+”)。
铸造(匹配)。选择(函数(x)x.Value)。ToArray()
尺寸r=dt.NewRow
Dim parentPath=String.Join(“.”,arr,0,arr.Count()-1)
r、 SetField(“ParentId”,dt.Rows.Cast(数据行的)。
FirstOrDefault(函数(x)x.Field(字符串)(“路径”)=父路径)?。
字段(整数)(“Id”))
r、 设置字段(“文本”,修订版)
r、 设置字段(“路径”,修订版)
r、 设置字段(“父路径”,父路径)
r、 设置字段(“级别”,arr.Count)
dt.行添加(r)
下一个
返回dt
端函数
此外,您还可以在最后一个窗口中从填充的TreeView创建DataTable:

私有迭代器函数GetAllNodes(节点作为TreeNodeCollection)_
(指树节点)可数的
对于节点中的每个tn.Cast(树节点)
产量总氮
对于GetAllNodes(tn.Nodes)中的每个cn
收益率cn
下一个
下一个
端函数
私有函数ToDataTable(tv作为TreeView)作为DataTable
Dim dt作为新数据表
dt.Columns.Add(“Id”,GetType(Integer)).AutoIncrement=True
Add(“ParentId”,GetType(整数))
添加(“文本”,GetType(字符串))
Add(“路径”,GetType(字符串))
Add(“ParentPath”,GetType(String))
添加(“级别”,GetType(整数))
对于GetAllNodes(tv.Nodes)中的每个节点
尺寸r=dt.NewRow
Dim parentPath=node.Parent?.Text
r、 SetField(“ParentId”,dt.Rows.Cast(数据行的)。
FirstOrDefault(函数(x)x.Field(字符串)(“路径”)=父路径)?。
字段(整数)(“Id”))
r、 设置字段(“文本”,node.Text)
r、 设置字段(“路径”,node.Text)
r、 设置字段(“父路径”,父路径)
r、 设置字段(“级别”,节点级别+1)
dt.行添加(r)
下一个
返回dt
端函数

注意,节点的属性返回每个节点的分支级别/组/关系。

这次不够清楚。你所说的关系是什么意思?您的意思是创建名为
1
的新节点的
1.17
1.18
1.19
子节点吗?。可能需要一个树来显示所需的输出并定义分组规则。我能理解第一组
parent 1
,但不能理解其余的。@JQSOFT我已经编辑了我的问题,其中有更多细节。请帮我再看看我的问题。1.17、1.18、1.19是根组,并用数字1标记。如何定义treeThanks的输出这么多都是为了你们的答案,但这完全不是我的目的。代码中的“关系”字段只是一个级别,而不是关系。例如,对于一个组“第一个子节点”(1.17.1.1,1.17.1.2)和一个组“第二个子节点”(1.17.2.1,1.17.2.2),按照您的代码,我们只知道孙子节点(1.17.1.2.1.1)的级别是级别3,我们不知道它是属于“第一个子节点”还是“第二个子节点”。你有什么想法来实现它吗?@Bruce每行的路径字段告诉你节点的层次结构。这就是这个领域存在的原因。例如,路径
1.17.1.2.1.2.1.5.1.2.1.1
准确地告诉您哪个父项的哪个子项。您需要找出代码中的关系。在一个数据表中,你可以做一些类似我的帖子的事情。非常感谢JQSOFT,我终于为自己找到了解决方案。它需要为自己建立一个理想。不过,非常感谢您的想法和帮助