2012-06-26 61 views
0

我有一个类型为HierarchyNode的'上级对象',它将具有相同类型HierarchyNode的childnodes(每个子节点可能有它们的子节点)。需要树状结构数据检索的帮助

我应该从'上级对象'中读取reqested父节点的子节点。所以我的代码如下(调用者 - superiorObject.IdentifySubNodeOfRequestedNode(...))。但是,如果循环被执行并且不是所有的代码返回值异常,foreach循环事件中的stopRecursiveCall都是false。如何解决这个问题并返回childnodes,或者有没有更好的解决方案来解决这个问题?由于

public List<HierarchyNode> IdentifySubNodeOfRequestedNode(int reqstedId, Boolean stopRecursiveCall) 
{ 
    if (this.UserId == reqstedId) 
    { 
     stopRecursiveCall = true; 
     return this.ChildNodes; 
    } 

    foreach (HierarchyNode childNode in this.ChildNodes) 
    { 
     childNode.IdentifySubNodeOfRequestedNode(reqstedId, stopRecursiveCall); 
     if (stopRecursiveCall) 
      break; 
    } 
} 
+1

你是不是你的方法中返回任何东西。它甚至编译? –

+0

此外,你总是检查this.UserId,你不递归其子节点... – digEmAll

+0

@digEmAll他其实是。他正在调用'childNode.IdentifySubNodeOfRequestedNode()' –

回答

4

无需对布尔

public class HierarchyNode 
{ 
    private decimal UserId; 
    private List<HierarchyNode> ChildNodes; 

    public List<HierarchyNode> IdentifySubNodeOfRequestedNode(int reqstedId) 
    { 
     if (this.UserId == reqstedId) 
     { 
      return this.ChildNodes; 
     } 

     return this.ChildNodes. 
      Select(childNode => childNode.IdentifySubNodeOfRequestedNode(reqstedId)). 
      FirstOrDefault(children => children != null); 
    } 
} 
+0

哦,我的。我从2.0开始就没有试过C#,但是所有这些功能成语看起来都很好吃。 –

+0

这是一段不错的代码 – Alex

+0

@无知:解决了我的问题。大!谢谢!!。除了使用bool之外,我的完整算法非常糟糕?正如维克托尼科莱特所教导的那样?我在哪里滞后? –

1

你的算法有几个缺陷,从底层主要问题干:您试图分离算法的主要目的(查找并返回的东西),并特设优化(停止循环一旦事情被发现)。

伪代码,你的算法应该做的是:

find(id): 
    if (this.id == id): 
    return this.children 
    foreach (child in this.children): 
    found = child.find(id) 
    if (found != null): 
     return found 
    return null 

这种联系在了一起找到价值和停止递归的行为(返回一个值时停止递归)的行为。