[C#] 使用递归将多条路径生成树
1. WPF项目中,需要将后端返回的路径按照树形结构展示,故选择递归。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public class TreeNodeModel : ObservableObject { private string nodeID; public string NodeID { get { return nodeID; } set { nodeID = value; RaisePropertyChanged(() => NodeID); } } private string nodeName; public string NodeName { get { return nodeName; } set { nodeName = value; RaisePropertyChanged(() => NodeName); } } private int level; public int Level { get { return level; } set { level = value; RaisePropertyChanged(() => Level); } } //字符串的形式记录下子结点名称 private ObservableCollection< string > childrenString; public ObservableCollection< string > ChildrenString { get { return childrenString; } set { childrenString = value; RaisePropertyChanged(); } } private ObservableCollection<TreeNodeModel> children; public ObservableCollection<TreeNodeModel> Children { get { return children; } set { children = value; RaisePropertyChanged(() => Children); } } } |
2. 递归函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public void RecursePathTree(TreeNodeModel TreeNode, string [] PathArray, int index) { //使用index标记递归的第几层,实现起来比较简单 string curPath = PathArray[index]; int curPathIndex = TreeNode.ChildrenString.IndexOf(curPath); index = index + 1; // 当前路径结点已经存在,以当前节点为根节点,递归下一层 if (curPathIndex >= 0) { RecursePathTree(TreeNode.Children[curPathIndex], PathArray, index); } else { //当前路径节点不存在,插入当前节点, 再以当前节点为根节点,递归下一层 TreeNode.ChildrenString.Add(curPath); TreeNode.Children.Add( new TreeNodeModel() { NodeName = curPath, ChildrenString = new ObservableCollection< string >() { }, Children = new ObservableCollection<TreeNodeModel>() { }, Level = index, NodeID = $ "{TreeNode.NodeID}_{TreeNode.ChildrenString.Count - 1}" }); RecursePathTree(TreeNode.Children[TreeNode.ChildrenString.Count-1], PathArray, index); } } |
3. 在主函数中,将多个路径的字符串数组转为树形结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public static void Main( string [] args) { // 声明一个树对象 TreeNodeModel AllPathTree = new TreeNodeModel() { NodeName = "计算机" , ChildrenString = new ObservableCollection< string >() { }, Children = new ObservableCollection<TreeNodeModel>() { }, Level = 0, NodeID = "0" }; //将要变成树的路径 list< string > pathes = new list< string >() { "hkey_local_machine/software/classes/interface/{be14c746-e9c8-5ef4-8811-68272ca94e59}/proxystubclsid32" , "hkey_local_machine/software/classes/interface/{3050f81e-98b5-11cf-bb82-00aa00bdce0b" , "hkey_local_machine/software/classes/interface/{5a1f6d75-8678-547c-8fd7-fbceb6ebf968}/proxystubclsid32" , "hkey_local_machine/system/driverdatabase/driverpackages/percsas2i.inf_amd64_a7f5d94e6751c911/strings" , "hkey_local_machine/software/classes/tabips.inkitem" , "hkey_local_machine/software/classes/dbrowprx.asserver.1/clsid" , "hkey_local_machine/software/microsoft/windows/currentversion/winevt/publishers/{b447b4de-7780-11e0-ada3-18a90531a85a}/channelreferences/1" , "hkey_current_user/software/classes/extensions/contractid/windows.backgroundtasks/activatableclassid/app.appxtanvqvfbkjcd1wc6zcqj5qw5hjn7k1n8.mca" , "hkey_local_machine/software/microsoft/windows/currentversion/sidebyside/winners/be8b161fe8e6040a/11.0" , "hkey_current_user/software/classes/local settings/software/microsoft/windows/currentversion" , "hkey_classes_root/adodb.command/clsid" }; foreach ( string path in pathes) { string [] pathArray = path.split( '/' ); RecursePathTree(AllPathTree, pathArray, 0); } // 将最终结果序列化后打印 Console.WriteLine(JsonConvert.SerializeObject(AllPathTree)); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现