优化 /// <summary> /// 树形数据转化 /// </summary> /// <param name="list">数据</param> /// <param name="parentId">父节点ID</param> /// <returns></returns> public static List<TreeModel> ToTree(this List<TreeModel> list,string parentId = "") { Dictionary<string, List<TreeModel>> childrenMap = new Dictionary<string, List<TreeModel>>(); Dictionary<string, TreeModel> parentMap = new Dictionary<string, TreeModel>(); List<TreeModel> res = new List<TreeModel>(); //首先按照 foreach (var node in list) { node.hasChildren = false; node.complete = true; // 注册子节点映射表 if (!childrenMap.ContainsKey(node.parentId)) { childrenMap.Add(node.parentId, new List<TreeModel>()); } else if (parentMap.ContainsKey(node.parentId)) { parentMap[node.parentId].hasChildren = true; } childrenMap[node.parentId].Add(node); // 注册父节点映射节点表 parentMap.Add(node.id, node); // 查找自己的子节点 if (!childrenMap.ContainsKey(node.id)) { childrenMap.Add(node.id, new List<TreeModel>()); } else { node.hasChildren = true; } node.ChildNodes = childrenMap[node.id]; } if (string.IsNullOrEmpty(parentId)) { // 获取祖先数据列表 foreach (var item in childrenMap) { if (!parentMap.ContainsKey(item.Key)) { res.AddRange(item.Value); } } } else { if (childrenMap.ContainsKey(parentId)) { return childrenMap[parentId]; } else { return new List<TreeModel>(); } } return res; }
时间: 2024-03-05 10:51:22 浏览: 43
这段代码主要是将一个列表形式的树形结构数据转换为树形结构的对象,实现了以下功能:
1. 将树形结构数据按照父子节点关系组织为一个字典,方便后续处理。
2. 将每个节点注册到父节点和子节点的映射表中。
3. 根据父节点和子节点的映射表,将每个节点的子节点列表设置为正确的值。
4. 获取指定父节点下的所有子节点列表。
但是,这段代码的可读性和可维护性都不太好,可以进行如下优化:
1. 将一些变量和逻辑进行重构,使得代码更加清晰和易于理解。
2. 使用 LINQ 和 Lambda 表达式替换 foreach 循环,使得代码更加简洁。
重构后的代码如下:
```csharp
public static List<TreeModel> ToTree(this List<TreeModel> list, string parentId = "")
{
// 将节点按照 ID 分组,方便后续处理
var nodesById = list.ToDictionary(node => node.id);
// 将节点按照 parentId 分组,方便后续处理
var nodesByParentId = list.GroupBy(node => node.parentId);
// 设置每个节点的子节点列表
foreach (var group in nodesByParentId)
{
var parentId = group.Key;
var parent = nodesById.GetValueOrDefault(parentId);
if (parent != null)
{
parent.ChildNodes = group.ToList();
parent.hasChildren = true;
}
}
// 获取指定父节点下的所有子节点列表
if (string.IsNullOrEmpty(parentId))
{
return nodesById.Values
.Where(node => !nodesById.ContainsKey(node.parentId))
.ToList();
}
else
{
var parent = nodesById.GetValueOrDefault(parentId);
return parent?.ChildNodes ?? new List<TreeModel>();
}
}
```
经过优化后的代码,更加清晰简洁,易于理解和维护。
阅读全文