フラットリストを辞書に解析するコードは次のとおりです。
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);