0

同じタイプのHierarchyNodeの子ノード(各子ノードに子ノードがある場合があります)を持つタイプHierarchyNodeの「上位オブジェクト」があります。

要求された親ノードの子ノードを「上位オブジェクト」から読み取る必要があります。したがって、私のコードは次のようになります(呼び出し元--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;
    }
}
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 に答える