gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:55:50 25 4
gpt4 key购买 nike

我有一些字符串看起来:

/Test Town
/Test Town/Interior
/Test Dungeon/Secret

给定任意路径列表,如何自动生成叶节点?我想解决方案涉及递归,但我不太明白。

我尝试使用循环来做到这一点,但我只得到了第一级。

上面的代码会产生如下内容:

enter image description here

最佳答案

这很有效。

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

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; }
}

现在我需要一个递归函数来构建树:

Func<
IEnumerable<IEnumerable<string>>,
IEnumerable<Tree<string>>>
buildTree = null;

buildTree = xss =>
xss
.ToLookup(xs => xs.FirstOrDefault(), xs => xs.Skip(1))
.Where(xs => xs.Key != null)
.Select(xs => new Tree<string>(xs.Key, buildTree(xs)));

然后,假设我在 lines 中有一个字符串列表变量,我只需要执行:

var tree =
buildTree(lines
.Select(x => new [] { "Root", }.Concat(x.Split('/').Skip(1))));

就是这样。如果你不算Tree<T>类,那么这只是三行代码。简单。


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

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; }
}

现在它会这样称呼:

var tree = new Tree<string>("Root", lines.Select(x => x.Split('/').Skip(1)));

但是,这意味着您需要控制 Tree<T>类。

第一个解决方案意味着您可以使用任何树结构。


这是适用于 System.Windows.Forms.TreeNode 的版本:

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()));

关于c# - 在列表中递归创建所有给定的树路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com