相同文件修订的组列表并建立它们之间的关系
Group list of the same file revisions and make relationship of them
我尝试将具有相同根的文件修订分组并在它们之间建立关系
例如:
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.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...)被分组为根组的第二个子组
与first child group(1.17.1.1.x.y)路径相同的1.17.1.2.1.1被归为first child group
的first grand child group
非常感谢您的帮助,非常感谢。
如果您想从 修订列表创建数据表,那么您可以使用相同的想法并针对 grouping/relation 问题进行一些更改来实现。
Private Function ToDataTable(revs As IEnumerable(Of String)) As DataTable
Dim dt As New DataTable
dt.Columns.Add("Id", GetType(Integer)).AutoIncrement = True
dt.Columns.Add("ParentId", GetType(Integer))
dt.Columns.Add("Text", GetType(String))
dt.Columns.Add("Path", GetType(String))
dt.Columns.Add("ParentPath", GetType(String))
dt.Columns.Add("Level", GetType(Integer))
For Each rev In revs.OrderBy(Function(x) x)
Dim arr = Regex.Matches(rev, "\d+\.\d+").
Cast(Of Match).Select(Function(x) x.Value).ToArray()
Dim r = dt.NewRow
Dim parentPath = String.Join(".", arr, 0, arr.Count() - 1)
r.SetField("ParentId", dt.Rows.Cast(Of DataRow).
FirstOrDefault(Function(x) x.Field(Of String)("Path") = parentPath)?.
Field(Of Integer)("Id"))
r.SetField("Text", rev)
r.SetField("Path", rev)
r.SetField("ParentPath", parentPath)
r.SetField("Level", arr.Count)
dt.Rows.Add(r)
Next
Return dt
End Function
您还可以从最后 中填充的 TreeView 创建一个 DataTable:
Private Iterator Function GetAllNodes(nodes As TreeNodeCollection) _
As IEnumerable(Of TreeNode)
For Each tn In nodes.Cast(Of TreeNode)
Yield tn
For Each cn In GetAllNodes(tn.Nodes)
Yield cn
Next
Next
End Function
Private Function ToDataTable(tv As TreeView) As DataTable
Dim dt As New DataTable
dt.Columns.Add("Id", GetType(Integer)).AutoIncrement = True
dt.Columns.Add("ParentId", GetType(Integer))
dt.Columns.Add("Text", GetType(String))
dt.Columns.Add("Path", GetType(String))
dt.Columns.Add("ParentPath", GetType(String))
dt.Columns.Add("Level", GetType(Integer))
For Each node In GetAllNodes(tv.Nodes)
Dim r = dt.NewRow
Dim parentPath = node.Parent?.Text
r.SetField("ParentId", dt.Rows.Cast(Of DataRow).
FirstOrDefault(Function(x) x.Field(Of String)("Path") = parentPath)?.
Field(Of Integer)("Id"))
r.SetField("Text", node.Text)
r.SetField("Path", node.Text)
r.SetField("ParentPath", parentPath)
r.SetField("Level", node.Level + 1)
dt.Rows.Add(r)
Next
Return dt
End Function
这里注意,节点的Level属性returns每个节点的分支level/group/relation
我尝试将具有相同根的文件修订分组并在它们之间建立关系
例如:
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.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...)被分组为根组的第二个子组 与first child group(1.17.1.1.x.y)路径相同的1.17.1.2.1.1被归为first child group
的first grand child group非常感谢您的帮助,非常感谢。
如果您想从
Private Function ToDataTable(revs As IEnumerable(Of String)) As DataTable
Dim dt As New DataTable
dt.Columns.Add("Id", GetType(Integer)).AutoIncrement = True
dt.Columns.Add("ParentId", GetType(Integer))
dt.Columns.Add("Text", GetType(String))
dt.Columns.Add("Path", GetType(String))
dt.Columns.Add("ParentPath", GetType(String))
dt.Columns.Add("Level", GetType(Integer))
For Each rev In revs.OrderBy(Function(x) x)
Dim arr = Regex.Matches(rev, "\d+\.\d+").
Cast(Of Match).Select(Function(x) x.Value).ToArray()
Dim r = dt.NewRow
Dim parentPath = String.Join(".", arr, 0, arr.Count() - 1)
r.SetField("ParentId", dt.Rows.Cast(Of DataRow).
FirstOrDefault(Function(x) x.Field(Of String)("Path") = parentPath)?.
Field(Of Integer)("Id"))
r.SetField("Text", rev)
r.SetField("Path", rev)
r.SetField("ParentPath", parentPath)
r.SetField("Level", arr.Count)
dt.Rows.Add(r)
Next
Return dt
End Function
您还可以从最后
Private Iterator Function GetAllNodes(nodes As TreeNodeCollection) _
As IEnumerable(Of TreeNode)
For Each tn In nodes.Cast(Of TreeNode)
Yield tn
For Each cn In GetAllNodes(tn.Nodes)
Yield cn
Next
Next
End Function
Private Function ToDataTable(tv As TreeView) As DataTable
Dim dt As New DataTable
dt.Columns.Add("Id", GetType(Integer)).AutoIncrement = True
dt.Columns.Add("ParentId", GetType(Integer))
dt.Columns.Add("Text", GetType(String))
dt.Columns.Add("Path", GetType(String))
dt.Columns.Add("ParentPath", GetType(String))
dt.Columns.Add("Level", GetType(Integer))
For Each node In GetAllNodes(tv.Nodes)
Dim r = dt.NewRow
Dim parentPath = node.Parent?.Text
r.SetField("ParentId", dt.Rows.Cast(Of DataRow).
FirstOrDefault(Function(x) x.Field(Of String)("Path") = parentPath)?.
Field(Of Integer)("Id"))
r.SetField("Text", node.Text)
r.SetField("Path", node.Text)
r.SetField("ParentPath", parentPath)
r.SetField("Level", node.Level + 1)
dt.Rows.Add(r)
Next
Return dt
End Function
这里注意,节点的Level属性returns每个节点的分支level/group/relation