[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));
}

  

posted @   戚戚绛绛  阅读(461)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示