0

我有一个 HierarchyNode 类型的“高级对象”,它将具有相同类型 HierarchyNode 的子节点(每个子节点可能有它们的子节点)。

我应该从“上级对象”中读取所需父节点的子节点。所以我的代码如下(调用者——superiorObject.IdentifySubNodeOfRequestedNode(...))。但是在 foreach 循环中 stopRecursiveCall 是错误的,即使 if 循环被执行并且也不是所有的代码返回值异常。如何解决这个问题并返回子节点,或者还有其他更好的解决方案吗?谢谢

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

2 回答 2

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);
    }
}
于 2012-06-26T12:23:47.773 回答
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

这将查找值的行为和停止递归的行为联系在一起(返回值时递归停止)。

于 2012-06-26T12:22:49.113 回答