用c#和递归写一个树状结构到磁盘
本文关键字:一个 结构 磁盘 递归 | 更新日期: 2023-09-27 18:08:58
我对C#
相当陌生,我正在尝试从列表中创建树结构,并将其写入文件系统。(我已经用过这个答案了)。
也就是说,我想在适当的深度创建目录和子目录。然而,我被深度卡住了,想不出如何循环遍历深度的每次迭代,然后返回开始再次写入,而不是只写所有0深度的目录,然后所有1深度的目录,等等,在同一个位置。
我在想还有一个递归的routine/method/function
,但是我就是想不起来。我希望我对编程的理解能更上一层楼。
static void Test(IEnumerable<TreeItem<category>> categories, int deep = 0)
{
foreach (var c in categories)
{
for (int i = 0; i < deep; ++i) {
System.IO.Directory.CreateDirectory(c.Item.Name);
}
Test(c.Children, deep + 1);
}
}
因为Directory.CreateDirectory
为您创建了所有的父目录,假设您为每个节点存储了完整的路径,您只需要将叶节点(没有子节点的节点)传递给它。
您可以编写递归搜索来检索叶节点,然后将该列表传递给CreateDirectory
。
static IEnumerable<TreeItem<category>> GetLeafs(IEnumerable<TreeItem<category>> tree)
{
foreach (var item in tree)
{
if (item.Children.Any())
{
// this is not a leaf, so find the leaves in its descendants
foreach (var leaf in GetLeafs(item.Children))
yield return leaf;
}
else
{
// no children, so this is a leaf
yield item;
}
}
}
static void CreateDirectories(IEnumerable<TreeItem<category>> categories)
{
foreach (var leaf in GetLeafs(categories))
{
System.IO.Directory.CreateDirectory(leaf.Item.Name);
}
}
如果您没有每个节点的完整路径,那么您可以使用与GetLeafs
相同的结构(尽管它更简单,因为您不需要在调用链上返回任何东西)来递归地遍历树,并在深入时创建目录:
static void CreateDirectories(IEnumerable<TreeItem<category>> tree)
{
foreach (var item in tree)
{
Directory.Create(c.Item.Name);
CreateDirectories(item.Children);
}
}
这个方法更简单,但是会导致对Directory.Create
的更多调用,这可能会对性能产生影响。