加载未知数量的孩子到 TreeNode

Loading unknown amount of childs to TreeNode

我从 API 获取数据,其中为每个用户存储了存档。 每个存档可以有1个到无限个子存档,每个子存档可以有1个到无限个子存档等等。

如何在没有 400 循环的情况下将每个存档及其子存档加载到 TreeNode 中。 我考虑过递归,但我不确定是否有更好的方法。

VB 示例:

Sub Main()
    For Each archive in Archives
        TreeView1.Nodes.Add(AllChilds(archive))
    Next
End Sub

Function AllChilds(parent_archive As Archive)
    If parent_archive.Archives.Count > 0 Then
        For Each subArchive As Archive In parent_archive.Archives
            If subArchive.Archives.Count > 0 Then
                TreeView1.Nodes.Add(subArchive.DisplayName)
                AllChilds(subArchive)
            Else
                Return subArchive
            End If
        Next subArchive
    Else
        Return parent_archive
    End If
End Function

C# 示例:

class SurroundingClass
{
    public void Main()
    {
        foreach (archive as Archive in archives.Archives)
            TreeView1.Nodes.Add(AllChilds(archive));
    }

    private void AllChilds(Archive parent_archive)
    {
        if (parent_archive.Archives.Count > 0)
        {
            foreach (Archive subArchive in parent_archive.Archives)
            {
                if (subArchive.Archives.Count > 0)
                {
                    TreeView1.Nodes.Add(subArchive.DisplayName);
                    AllChilds(subArchive);
                }
                else
                    return subArchive;
            }
        }
        else
            return parent_archive;
    }
}

我假设您有一个看起来像这样的 Archive class:

Public Class Archive

    Public Property DisplayName As String
    Public ReadOnly Property Archives As List(Of Archive)

End Class

并且您代码中的 ArchivesList(Of Archive) 或实现 IEnumerable(Of Archive) 的其他内容。就像 TreeView 的节点一样,这是一个固有的递归数据结构。因此,递归可能是遍历它并构建节点树的最佳方式,例如

Private Sub ArchivesToTreeNodes(archives As IEnumerable(Of Archive), nodes As IList)
    For Each archive In archives
        Dim node As New TreeNode(archive.DisplayName)

        ArchivesToTreeNodes(archive.Archives, node.Nodes)
        nodes.Add(node)
    Next
End Sub

示例用法:

Dim nodes As New List(Of TreeNode)

ArchivesToTreeNodes(Archives, nodes)
TreeView1.Nodes.AddRange(nodes.ToArray())