【问题标题】:Writing a tree structure to disk using C# and recursion使用 C# 和递归将树结构写入磁盘
【发布时间】:2015-08-21 03:11:11
【问题描述】:

我对@9​​87654322@ 还很陌生,我正在尝试从列表中获取我创建的树结构,并将其写入文件系统。 (我用过这个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);
    }
}

【问题讨论】:

    标签: c# recursion tree


    【解决方案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 的更多调用,这可能会对性能产生影响。

    【讨论】:

    • 这很有趣,谢谢你的例子。我没有意识到有人可以写var leaf in GetLeafs(categories)——也就是说,in 是一个调用的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多