没有递归的步行文件夹树c#

时间:2016-11-29 11:49:28

标签: c# recursion

如何使用非递归更改此递归循环? 我知道这种方法很简单,但我对这种解决方案的非递归方式很感兴趣。

using System;
using System.IO;

namespace NonRecursion {
    class NonRecursion {
        static void Main() {
            string createPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            string getPath = createPath + @"\folder";
            GetDirsPath(getPath);

            Console.ReadKey();
        }

        static void GetDirsPath(string getPath) {
            string[] dirs = Directory.GetDirectories(getPath);

            for (int i = 0; i < dirs.Length; i++) {
                Console.WriteLine(dirs[i]);
                GetDirsPath(dirs[i]);
            }
        }
    }
}

我可以只更改此功能吗?

static void GetDirsPath(string getPath) {
            string[] dirs = Directory.GetDirectories(getPath);

            for (int i = 0; i < dirs.Length; i++) {
                Console.WriteLine(dirs[i]);
                GetDirsPath(dirs[i]);
            }
        }

2 个答案:

答案 0 :(得分:3)

这个怎么样:

public static IEnumerable<string> AllFolders(string root)
{
    var folders = new Stack<string>();
    folders.Push(root);

    while (folders.Count > 0)
    {
        string folder = folders.Pop();
        yield return folder;

        foreach (var item in Directory.EnumerateDirectories(folder))
            folders.Push(item);
    }
}

测试代码(控制台应用):

static void Main()
{
    foreach (var dir in AllFolders("<your root folder here>"))
    {
        Console.WriteLine(dir);
    }
}

以下是使用List<string>

的替代方法
public static IEnumerable<string> AllFolders(string root)
{
    var folders = new List<string> {root};

    while (folders.Count > 0)
    {
        string folder = folders[folders.Count - 1];
        folders.RemoveAt(folders.Count-1);
        yield return folder;
        folders.AddRange(Directory.EnumerateDirectories(folder));
    }
}

这两种方式都是一样的:

他们维护一个尚未输出的目录列表(或堆栈),从根目录开始。

算法从堆栈/列表中删除最顶层(堆栈)或最后一个(列表)目录并输出它。然后他们将该目录的所有子目录添加到列表/堆栈并重复,直到列表/堆栈为空。

请注意,List<>版本实际上只是使用List<>作为Stack<>,因此它在算法上是相同的。

如果您只想对GetDirsPath()方法进行微小更改:

static void GetDirsPath(string getPath)
{
    var dirs = new List<string> { getPath };

    while (dirs.Count > 0)
    {
        string dir = dirs[dirs.Count - 1];
        dirs.RemoveAt(dirs.Count - 1);
        Console.WriteLine(dir);
        dirs.AddRange(Directory.EnumerateDirectories(dir));
    }
}

答案 1 :(得分:2)

您可以使用GetDirectories方法:

m

要迭代它们:

k

https://msdn.microsoft.com/en-us/library/bb513869.aspx