我有一个HierarchyNode类型的'高级对象',它具有相同类型HierarchyNode的子节点(每个子节点可能有它们的子节点)。
我应该从'上级对象'中读取重新请求的父节点的子节点。所以我的代码如下(caller - superiorObject.IdentifySubNodeOfRequestedNode(...))。但是,如果循环执行并且并非所有代码都返回值异常,那么在foreach循环中stopRecursiveCall为false。如何解决这个并返回子节点或者还有其他更好的解决方案吗?感谢
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;
}
}
答案 0 :(得分:4)
不需要bool
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);
}
}
答案 1 :(得分: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
这将查找值的行为与停止递归的行为联系在一起(当返回值时递归停止)。