我尝试在递归方法中将List连接到另一个时遇到问题。每次递送时我都可以打印出List的每个成员,但是一旦我尝试将它添加到另一个主列表中,它似乎就会出现问题。
我得到的错误是:空对象引用错误。
我这样做的主要动机是以递归方式创建给定文件夹/路径中所有目录和子目录的列表。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace listsubdirsinfile
{
class Program
{
public static DirectoryInfo directory;
public static List<DirectoryInfo> allSubDirectories;
public static FileInfo[] files;
static void Main(string[] args)
{
directory = new DirectoryInfo(@"C:\cs\");
allSubDirectories = getAllSubdirectories(directory);
Console.WriteLine("allSubdirectories\n-----------------");
foreach (DirectoryInfo aDirectory in allSubDirectories)
{
Console.WriteLine(aDirectory.ToString());
}
Console.ReadKey();
}
static List<DirectoryInfo> getAllSubdirectories(DirectoryInfo dir)
{
List<DirectoryInfo> subDirs = new List<DirectoryInfo>();
subDirs = dir.GetDirectories().ToList();
foreach (DirectoryInfo sDir in subDirs)
{
Console.WriteLine(sDir.ToString());
// allSubDirectories.Add(sDir);
subDirs.Concat(getAllSubdirectories(sDir));
}
return subDirs;
}
}
}
我评论的部分是导致问题的一点。
非常感谢您给予的任何帮助!
答案 0 :(得分:4)
您使用的是.NET 4吗?在这种情况下:
System.IO.Directory.GetDirectories(@"C:\My Sample Path\","*",
System.IO.SearchOption.AllDirectories);
答案 1 :(得分:3)
而不是:
allSubDirectories.Add(sDir);
应该是:
subDirs.Add(sDir);
您刚使用了错误的变量名称。 allSubDirectories
是类级别的,并且在调用getAllSubdirectories
时不会实例化。
更好的递归解决方案,有时候(尤其是当您使用Concat
替代时)是Stack<T>
:
static List<DirectoryInfo> getAllSubdirectories(DirectoryInfo dir)
{
List<DirectoryInfo> subDirs = new List<DirectoryInfo>();
Stack<DirectoryInfo> toProcess = new Stack<DirectoryInfo>();
toProcess.Push(dir);
while(toProcess.Count > 0) {
subDirs.AddRange(toProcess.Pop().GetDirectories());
}
return subDirs;
}