0

我只是好奇为什么我必须在使用string[]时使用Directory.GetDirectories()

string[] directories = Directory.GetDirectories("c:\\");

foreach (var dir in directories)
{
     Console.WriteLine(dir);
}

为什么我不能使用

List<string> _directories = new List<string>();
        _directories = Directory.GetDirectories("c:\\");
4

5 回答 5

10

因为GetDirectories返回 a string[],基本上。

无论如何,您可以:

List<string> _directories = new List<string>(Directory.GetDirectories("c:\\"));

...或者:

List<string> _directories = Directory.GetDirectories("c:\\").ToList();
于 2012-05-09T13:47:31.557 回答
5

你应该使用Directory.EnumerateDirectories()无论如何 - 因为它只会枚举目录,而不是填充整个数组 - 这将使用更少的内存。

来自 MSDN:

EnumerateDirectories 和 GetDirectories 方法的区别如下: 使用 EnumerateDirectories 时,可以在返回整个集合之前开始枚举名称集合;使用 GetDirectories 时,必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,EnumerateDirectories 会更有效。

(除非你真的需要一个填充数组)

编辑:

所以 - 更具体地回答这个问题 - 如果你想返回 List<> 类型,你最好这样做:

var dirs = Directory.EnumerateDirectories("c:\\").ToList();

因为这将避免转换的“数组”步骤。

于 2012-05-09T13:48:39.733 回答
3

Directory.GetDirectoriesList<T>自 .Net 1.1 以来一直存在,然后才引入诸如此类的泛型。

于 2012-05-09T13:49:49.840 回答
0

简短的回答是性能。如果您事先知道您将拥有多少个项目(并且您会进行搜索),您可以预先分配一个普通数组并填充它,而不会使用双倍增长策略惩罚List<>

一旦你有了你的基本string[]对象,你可以很容易地把它提供给一个列表,如果你真的需要的话,可以附加到它上面。采用另一种方式会导致最常用用例的性能损失。

于 2012-05-09T13:50:28.653 回答
0

因为它显然是方法的返回类型。

于 2012-05-09T13:48:04.687 回答