Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 要添加到树视图的列表上的递归循环_C#_Recursion_Tree_Treeview - Fatal编程技术网

C# 要添加到树视图的列表上的递归循环

C# 要添加到树视图的列表上的递归循环,c#,recursion,tree,treeview,C#,Recursion,Tree,Treeview,我有一个类的列表,该类还有一个用于在树状视图中显示地图的类 public class Option { public Guid Id; public string Title; public string Description; public List<GotoOption> GotoOptions; public bool IsEnd; public string GotoValueParent; public Opti

我有一个类的列表,该类还有一个用于在树状视图中显示地图的类

public class Option
{
    public Guid Id;

    public string Title;
    public string Description;
    public List<GotoOption> GotoOptions;
    public bool IsEnd;
    public string GotoValueParent;

    public Option()
    {
        this.IsEnd = false;
        this.GotoOptions = new List<GotoOption>();
    }

}

public class GotoOption
{
    public Guid GotoId;
    public string Value;
}

这是只循环3层,但我们可以有10-25多个层,这是大量的手动代码。我一直在研究它是如何处理文件和文件夹的,但我似乎无法将它从如何处理文件和文件夹转换为如何处理我的代码。任何帮助都会很好。

为了解决这个问题,我创建了一个可选的参数,传入已创建的节点,如果没有传入该参数,它将创建一个新的参数

private void PopulateTreeView(Option option, TreeNode existingNode = null)
{
    if (option != null)
    {
        TreeNode newNode = new TreeNode();
        newNode.Text = option.Title;
        newNode.Tag = option;

        if (existingNode == null)
        {
            pages.Nodes.Add(newNode);
        }
        else
        {
            existingNode.Nodes.Add(newNode);
        }

        foreach (GotoOption gotoOption in option.GotoOptions)
        {
            Option newOption = Options.FirstOrDefault(i => i.Id == gotoOption.GotoId);
            PopulateTreeView(newOption, newNode);
        }
    }
}

Options.firstOrdefault=>i.Id==op.GotoId。什么是Option?Option是类,我已经给出了Option是什么的代码。对不起,我问了关于IEnumerable的变量选项。它是一个选项容器吗?我不明白你想说什么对不起;您的示例中未定义变量选项。你能给出它的定义吗?
private void PopulateTreeView(Option option, TreeNode existingNode = null)
{
    if (option != null)
    {
        TreeNode newNode = new TreeNode();
        newNode.Text = option.Title;
        newNode.Tag = option;

        if (existingNode == null)
        {
            pages.Nodes.Add(newNode);
        }
        else
        {
            existingNode.Nodes.Add(newNode);
        }

        foreach (GotoOption gotoOption in option.GotoOptions)
        {
            Option newOption = Options.FirstOrDefault(i => i.Id == gotoOption.GotoId);
            PopulateTreeView(newOption, newNode);
        }
    }
}
private void CreateTreeView()
{
    var roots = Options.Select(z => z.Id)

        .Except(Options.SelectMany(z => z.GotoOptions.Select(x => x.GotoId)))

        .Select(z => Options.Single(x => x.Id == z));

    var treeNodes = roots.Select(GetNode);

    foreach (var treeNode in treeNodes)
    {
        pages.Nodes.Add(treeNode);
    }
}

private TreeNode GetNode(Option option)
{
    var node = new TreeNode
    {
        Text = option.Title,
        Tag = option
    };

    foreach (var child in option.GotoOptions.Select(z => Options.Single(x => x.Id == z.GotoId)))
    {
        node.Nodes.Add(GetNode(child));
    }

    return node;
}