2015-08-09 120 views
2

标题可能不是最清晰的。我为此道歉。通过嵌套列表循环显示为列表

想象一下,我有一个评论列表。每条评论都可以拥有自己的评论列表(评论回复),每条评论回复都可以有自己的评论回复列表等等。

它看起来有点像这样:

Comment1: Wow, that's cool |-Comment1.1: No, it's not. You're stupid. |-|-Comment1.1.1: Why the flame? |-Comment1.2: Yeah, I agree! Comment2: I like horses |-Comment2.1: Offtopic. |-|-Comment2.1.1: Does it really matter?

它显然是有要来一次亲子之类的树的事情。但是说我不知道​​每条评论有多少层次。我如何循环每个评论,就好像它是一个平面的一维数组?

+6

递归可能是一种方法。 – Tim

+0

哦,没错。我没有想过递归! – hexagonest

回答

2

这个结构被称为树,你问的是“走树”。有很多方法可以做到这一点,递归是一个有趣的选择。

你将不得不提供更多的信息,比如你会得到一个特定的答案之前,你有什么数据结构存储树。

这一切归结为一组循环遍历树的每个分支中的所有孩子。

当您使用递归你写一个遍历当前节点的所有子功能,并为每个孩子,你调用同一个函数来投奔它的孩子......

编辑:这里是一个粗略的例子

void processNode(TreeNode t) 
{ 
    // Here print it out to print all nodes or add it to an 
    // ArrayList to just make a list, or whatever you please. 
} 

void walkTreeNode(TreeNode t) 
{ 
    processNode(t); 
    foreach (TreeNode child in t.getChildren()) 
     walkTreeNode(child); 
} 

现在,您只需将treeTreeNode与树的根调用即可。

+0

谢谢你。我将尝试编写一个递归函数,基本上这样: 1.循环遍历数组 2.在数组内,检查数组是否包含更多数组 3.如果是这样,self(该数组) – hexagonest

+0

应该是简单。该函数应该只处理当前节点,并在其每个子节点上调用“process”,然后重复该节点直到该节点没有子节点。 – Cobusve

+0

那么,我将如何使用这个递归函数来写入一个新的函数呢?目前我已经得到了这个。 '的IEnumerable WalkTheTree (IEnumerable的 C) { 如果(c.Count()<1)返回新T [0]; IEnumerable final; IEnumerable final; foreach(IEnumerable c)中的项 //不是所有的代码路径都返回一个值。最终= WalkTheTree(item); } }' 编辑:https://gist.github.com/anonymous/4e89428fd8064e129dd5 – hexagonest