使用递归将自底向上员工数据转换为自顶向下层级结构
问题排查与修正方案
原有代码核心问题
- 根节点的
Children属性未赋值,递归生成的子节点列表没有和根节点绑定,最终输出的根节点只有名称没有层级结构 - 递归逻辑混乱:遇到有下属的员工时,没有为该员工创建对应的
Roo对象,也没有把递归得到的下属节点塞到该对象的Children属性里,所有节点都直接塞到全局传的children列表,完全丢失了层级关系 - 没必要用
ref传递列表,递归函数直接返回当前姓名对应的Roo对象,逻辑会清晰很多
修正后代码
// 主逻辑 var leader = empList.FirstOrDefault(x => x.Manager == string.Empty); Roo root = BuildTree(empList, leader.Name); // 递归构建树的函数,输入员工列表和当前节点姓名,返回构建好的Roo节点 Roo BuildTree(List<Emp> empList, string currentName) { // 先创建当前节点 var currentNode = new Roo { Name = currentName, Children = new List<Roo>() }; // 找当前节点的所有直属下属 var subordinates = empList.Where(x => x.Manager == currentName).ToList(); // 遍历每个下属,递归构建下属节点,加到当前节点的Children里 foreach (var sub in subordinates) { currentNode.Children.Add(BuildTree(empList, sub.Name)); } // 如果需要把没有下属的节点的Children设为null,打开下方注释即可 // if (!currentNode.Children.Any()) currentNode.Children = null; return currentNode; } // 之后直接序列化root为JSON即可
输出JSON结构示例
序列化后得到的层级结构符合要求:
{ "Name": "RH", "Children": [ { "Name": "JS", "Children": [ { "Name": "AV", "Children": [ {"Name":"TD","Children":[]}, {"Name":"DL","Children":[]} ] } ] }, { "Name": "DD", "Children": [ {"Name":"KM","Children":[]} ] } ] }
内容的提问来源于stack exchange,提问作者blue piranha
相关产品推荐
相关产品推荐

