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