相同文件修订的组列表并建立它们之间的关系

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