2014-11-04 31 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