[C#] 使用递归将多条路径生成树
1. WPF项目中,需要将后端返回的路径按照树形结构展示,故选择递归。
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 ObservableCollectionchildrenString; public ObservableCollection ChildrenString { get { return childrenString; } set { childrenString = value; RaisePropertyChanged(); } } private ObservableCollection children; public ObservableCollection Children { get { return children; } set { children = value; RaisePropertyChanged(() => Children); } } }
2. 递归函数
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() { }, Children = new ObservableCollection () { }, Level = index, NodeID = $"{TreeNode.NodeID}_{TreeNode.ChildrenString.Count - 1}" }); RecursePathTree(TreeNode.Children[TreeNode.ChildrenString.Count-1], PathArray, index); } }
3. 在主函数中,将多个路径的字符串数组转为树形结构
public static void Main(string[] args) { // 声明一个树对象 TreeNodeModel AllPathTree = new TreeNodeModel() { NodeName = "计算机", ChildrenString = new ObservableCollection() { }, Children = new ObservableCollection () { }, Level = 0, NodeID = "0" }; //将要变成树的路径 list pathes = new list () { "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)); }