如何使用非递归更改此递归循环? 我知道这种方法很简单,但我对这种解决方案的非递归方式很感兴趣。
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]);
}
}
答案 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)