2014-11-04 32 views
-1

假设我有超过100个文件夹路径的列表。我想从每个文件夹路径中检索一个文件路径。这是我正在做的或者打算做的方式:从文件夹列表中检索一个文件路径的最有效方法

var Files = new List<String>(); 
var Directories = Directory.GetDirectories("C:\\Firstfolder\\Secondfolder\\"); 
Array.ForEach(Directories, D => Files.Add(Directory.GetFiles(D).FirstOrDefault())); 

现在,这是最有效的方法吗?因为我的程序每次启动时都会执行此代码。

+0

FYI略OT:使用@ “C:\ Firstfolder \ Secondfolder \” 避免双重,和硬阅读,反斜杠。如果你正在做路径操作,请使用[http://stackoverflow.com/questions/961704/how-do-i-join-two-paths-in-c](Path.Combine)。 – LosManos 2014-11-04 11:24:47

回答

1

如果您使用的是.NET 4.0,你应该这样做,而不是...

var Files = Directories.SelectMany(x => Directory.EnumerateFiles(x).FirstOrDefault()).ToList(); 
+0

尼斯...简短而高效。我希望:) – 2014-11-04 11:39:44

+0

糟糕...我想我应该在除外之前测试代码。但不是什么大问题,我喜欢这个想法......我必须按照以下方式更改代码才能正常工作。 var Files = String.Join(“”,Directories.SelectMany(x => Directory.EnumerateFiles(x).FirstOrDefault()))。 – 2014-11-04 12:15:38

6

代替Directory.GetFiles使用Directory.EnumerateFiles,以避免加载所有文件路径为memory.This从documentation引用了差异:

EnumerateFilesGetFiles方法的区别如下:当您使用EnumerateFiles,你就可以开始在返回整个集合之前枚举名称集合;当您使用GetFiles时,必须等待返回完整的数组名称才能访问该数组。因此,当您使用许多文件和目录时,EnumerateFiles可以更高效。

+1

你可以注意到,'GetFiles'返回数组,这是渴望的。 'EnumerateFiles'返回'IEnumerable',这是懒惰的(可能) – 2014-11-04 11:21:44