2013-08-03 32 views
2

我有一些字符串看起来:以递归方式在列表中创建所有给定的树路径?

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

鉴于pathes的任意列表,我怎么能自动生成叶节点?我想象的解决方案涉及递归,但我不能完全明白。

我试图用循环做,但我只有第一级。

以上会产生这样的:

enter image description here

+0

你们是不是要过滤列表仅返回叶节点?或者你想要一个树结构? – Enigmativity

+0

@Enigmativity我只是想要树结构 - 所以一个根节点,然后所有的孩子分开。如果不清楚,我会用照片编辑我的帖子。 –

回答

4

这工作得相当好。

首先,我不得不创建一个树形结构:

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

我想我会不得不对这棵树进行按顺序遍历并且创建Tree-Nodes? –

+0

@VaughanHilts - 不,只需将我的“树”类别替换为您正在使用的类别。你可能不得不做一些蠕动的代码,但你应该可以很容易地做到这一点。 – Enigmativity

+0

StartWith方法在哪里定义? – fcuesta