-2

以下のコードは機能しますが、再帰の使用は避けたいと思います。ListOfAllNodesは、データベース内のすべてのノードのフラットリストであり、IdフィールドとParentIdフィールドがあります。

private Node FillChildNodes(Node node)
{
   foreach (var childNode in ListOfAllNodes.Where(i => i.ParentId == node.Id).OrderBy(x => x.Name))
   {
           node.Children.Add(childNode);
           FillChildNodes(childNode);
   }
   return node;
}
4

1 に答える 1

0

フラットリストを辞書に解析するコードは次のとおりです。

Dictionary<IComparable, List<Node>> nodes = new Dictionary<IComparable, List<Node>>();
Node parentNode = null;
foreach(var node in ListOfAllNodes)
{
    if(node.ParentId == null)
    {
        parentNode = node;
    }else
    {
        if(!nodes.ContainsKey(node.ParentId)){
           nodes.Add(node.ParentId, new List<Node>());
        }
        nodes[node.ParentId].Add(node);
    }
}

null上記のコードは、最上位ノードとなるParentIdを持つ1つのノードを除いて、すべてのノードが有効な(つまり、null以外の)ParentIdを持っていることを前提としています。FillChildNodes次に、関数のパラメーターとして辞書を使用できます。

private Node FillChildNodes(Node node, Dictionary<IComparable, List<Node>> dict)
{
   foreach (var childNode in dict[node.Id].OrderBy(x => x.Name))
   {
       node.Children.Add(childNode);
       FillChildNodes(childNode);
   }
   return node;
}

// call this on the variables build above:
FillChildNodes(parentNode, nodes);
于 2013-03-27T14:33:07.540 に答える