C# 递归地在列表中创建所有给定的树路径?

C# 递归地在列表中创建所有给定的树路径?,c#,winforms,recursion,treeview,C#,Winforms,Recursion,Treeview,我有一些字符串,看起来: /Test Town /Test Town/Interior /Test Dungeon/Secret 给定任意路径列表,如何自动生成叶节点?我想这个解决方案涉及递归,但我不太明白 我试着用一个循环,但我只得到了第一级 上述情况将产生如下结果: 这相当有效 首先,我必须创建一个树结构: public class Tree<T> : List<Tree<T>> { public Tree(T value, IEnumerabl

我有一些字符串,看起来:

/Test Town
/Test Town/Interior
/Test Dungeon/Secret
给定任意路径列表,如何自动生成叶节点?我想这个解决方案涉及递归,但我不太明白

我试着用一个循环,但我只得到了第一级

上述情况将产生如下结果:


这相当有效

首先,我必须创建一个树结构:

public class Tree<T> : List<Tree<T>>
{
    public Tree(T value, IEnumerable<Tree<T>> children)
    {
        this.Value = value;
        this.AddRange(children);
    }
    public T Value { get; set; }
}
就这样。如果不计算树类,那么这只是三行代码。简单

作为替代方案,如果您不想使用匿名方法,可以修改树类,如下所示:

public class Tree<T> : List<Tree<T>>
{
    public Tree(T value, IEnumerable<IEnumerable<T>> inner)
    {
        this.Value = value;
        this.AddRange(inner
            .ToLookup(xs => xs.FirstOrDefault(), xs => xs.Skip(1))
            .Where(xs => xs.Key != null)
            .Select(xs => new Tree<T>(xs.Key, xs)));
    }
    public T Value { get; set; }
}

这相当有效

首先,我必须创建一个树结构:

public class Tree<T> : List<Tree<T>>
{
    public Tree(T value, IEnumerable<Tree<T>> children)
    {
        this.Value = value;
        this.AddRange(children);
    }
    public T Value { get; set; }
}
就这样。如果不计算树类,那么这只是三行代码。简单

作为替代方案,如果您不想使用匿名方法,可以修改树类,如下所示:

public class Tree<T> : List<Tree<T>>
{
    public Tree(T value, IEnumerable<IEnumerable<T>> inner)
    {
        this.Value = value;
        this.AddRange(inner
            .ToLookup(xs => xs.FirstOrDefault(), xs => xs.Skip(1))
            .Where(xs => xs.Key != null)
            .Select(xs => new Tree<T>(xs.Key, xs)));
    }
    public T Value { get; set; }
}

是否尝试筛选列表以仅返回叶节点?或者你想要一个树状结构作为结果?@Enigmativity我只想要树状结构-所以根节点和子节点都分开。如果不清楚,我将用图片编辑我的帖子。是否尝试筛选列表以仅返回叶节点?或者你想要一个树状结构作为结果?@Enigmativity我只想要树状结构-所以根节点和子节点都分开。如果不清楚的话,我会用一张图片编辑我的帖子。我想我必须先遍历这棵树,然后用它们创建树节点?@VaughanHilts-不,用你正在使用的树类替换我的树类。您可能需要对代码进行一些修改,但您应该能够相当轻松地完成。StartWith方法定义在哪里?那么现在就来试一试。希望我能把它裹在头上@抱歉,StartWith是被动框架团队的一个交互式扩展。我将用一个Concat替换它。我想接下来我必须按顺序遍历这棵树,并用它们创建树节点?@VaughanHilts-不,用您正在使用的树类替换我的树类。您可能需要对代码进行一些修改,但您应该能够相当轻松地完成。StartWith方法定义在哪里?那么现在就来试一试。希望我能把它裹在头上@抱歉,StartWith是被动框架团队的一个交互式扩展。我要换一个海螺。
var tree = new Tree<string>("Root", lines.Select(x => x.Split('/').Skip(1)));
Func<
    IEnumerable<IEnumerable<string>>,
    IEnumerable<TreeNode>>
        buildTreeNode = null;
buildTreeNode = xss =>
    xss
        .ToLookup(xs => xs.FirstOrDefault(), xs => xs.Skip(1))
        .Where(xs => xs.Key != null)
        .Select(xs => new TreeNode(xs.Key, buildTreeNode(xs).ToArray()));