Сгруппируйте список одних и тех же файловых ревизий и составьте из них связь - PullRequest
2 голосов
/ 29 апреля 2020

Я пытаюсь сгруппировать те из файлов ревизии, которые имеют одинаковые root и установить между ними отношения

Например:

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

Моя идея состоит в том, чтобы l oop просмотреть список и попытаться найти число di git, разделив его по точкам, а затем сравнить его с теми, что указаны в списке, но оно кажется плохим

Я не понимаю Не знаю, есть ли лучший способ достичь этого в 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 ...) сгруппированы как root группа 1.17.1.1, 1.17.1.2 (может иметь 1.17.1.3, 1.17.1.4 ...) сгруппированы как первая дочерняя группа root группа 1.17.2.1, 1.17.2.2 (может иметь 1.17.2.3, 1.17.2.4 ...) сгруппированы как вторая дочерняя группа root группы 1.17.1.2.1.1, которые имеют тот же путь, что и первая дочерняя группа (1.17.1.1.xy) Пед как первая внебрачная группа первой дочерней группы

Я очень ценю любую помощь и большое спасибо за нее.

1 Ответ

1 голос
/ 30 апреля 2020

Если вы хотите создать DataTable из списка того же ревизий, то вы можете добиться этого, используя ту же идею с некоторыми изменениями для проблемы группировки / отношения.

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

Также вы можете создать DataTable из заполненного TreeView в последнем ответе :

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 узла возвращает уровень / группу ветвей / отношение каждого узла.

...