我对C#
相当新,我试图采用我从列表中创建的树结构,并将其写入文件系统。 (我已使用此answer)。
也就是说,我想以适当的深度创建目录和子目录。然而,我陷入了深度困境,无法想到如何循环深度的每次迭代,然后退出再次开始写入,而不是只编写所有0深度目录,然后是所有1深度目录等等,在同一地点。
我认为还有另一个递归routine/method/function
,但我无法绕过它。在我对编程的理解中,我想进入下一个级别(ha)。
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);
}
}
答案 0 :(得分:3)
因为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
的更多调用,这可能会对性能产生影响。