作者:蛋壳 | 来源:互联网 | 2024-11-20 11:31
C#教程:递归构建父子关系的树结构
在许多应用程序中,数据往往以层次结构的形式存在,如组织结构图或文件系统。本文将指导你如何在C#中使用递归方法将一个简单的列表转换成树形结构,特别是当你的数据模型中的键和父键都是字符串类型时。
假设我们有一个节点列表,每个节点包含名称、唯一标识符(键)、父节点的标识符(父键)以及层级信息。我们的目标是将这个列表转换成一个树形结构,以便于后续的数据处理或展示。
internal class Program {
private static void Main(string[] args) {
List nodeList = new List();
node n = new node("A", "A1", null, 1);
nodeList.Add(n);
n = new node("B", "A2", "A1", 2);
nodeList.Add(n);
// ... 其他节点
n = new node("P", "A16", null, 1);
nodeList.Add(n);
n = new node("Q", "A17", "A16", 2);
nodeList.Add(n);
}
}
public class node {
public string name { get; set; }
public string key { get; set; }
public string parentKey { get; set; }
public int level { get; set; }
public List Children { get; set; }
public node(string Name, string Key, string PK, int Level) {
name = Name;
key = Key;
parentKey = PK;
level = Level;
Children = new List();
}
}
为了实现这一目标,我们需要编写一个方法来递归地查找每个节点的子节点,并将它们添加到相应的父节点下。以下是实现这一功能的扩展方法:
public static class GroupEnumerable {
public static IList BuildTree(this IEnumerable source) {
var groups = source.GroupBy(i => i.parentKey);
var roots = groups.FirstOrDefault(g => g.Key == null)?.ToList() ?? new List();
if (roots.Any()) {
var dict = groups.Where(g => g.Key != null).ToDictionary(g => g.Key, g => g.ToList());
foreach (var root in roots) {
AddChildren(root, dict);
}
}
return roots;
}
private static void AddChildren(node node, IDictionary> source) {
if (source.TryGetValue(node.key, out var children)) {
node.Children.AddRange(children);
foreach (var child in children) {
AddChildren(child, source);
}
}
}
}
以上代码首先将所有节点按父键分组,然后找到所有没有父节点的根节点。对于每一个根节点,递归地添加其子节点。这样,最终我们可以得到一个完整的树形结构,方便进一步处理或展示。
希望本教程对你有所帮助,如果你有任何问题或需要进一步的帮助,请随时留言讨论!