如何重构这个c#树填充方法以避免使用递归
本文关键字:方法 填充 递归 何重构 重构 | 更新日期: 2023-09-27 18:06:12
下面的代码可以工作,但是我想避免使用递归。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;
}
下面是将平面列表解析为字典的代码:
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);
}
}
上面的代码假设所有节点都有一个有效的(即非空的)ParentId,除了一个节点有一个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);