2017-06-22 84 views
0

當運行以下代碼:的GetFiles和EnumerateFiles跳過foreach循環

var files = dir.EnumerateFiles("*.*", 
    SearchOption.AllDirectories).Where(f => ext.Contains(Path.GetExtension(f.FullName))) 
foreach (FileInfo file in files) 
    { 
    file.CopyTo(destPath, true); 
    } 

DIR是一個DirectoryInfo
分機是一個字符串包含接受的文件擴展名

在一個列表進入foreach循環,文件是null
在foreach(在語句)內,該程序跳回=>聲明蓄滿文件。完成後,它會跳過foreach循環並永遠不會輸入它。

我迷失在這裏。爲什麼我的代碼跳回一行?我嘗試枚舉和GetFiles,似乎沒有工作。

+0

也許需要擴展在分機列表中的一個點 – Slai

+0

這也工作。謝謝您的幫助。 –

回答

0

代碼「跳回」的原因是Deferred Execution。您在那裏得到的LINQ表達式在foreach循環中使用結果之前並未實際執行。

至於跳過foreach循環 - 這是因爲枚舉是空的。正如@Slai在評論中提到的那樣,擴展名列表可能存在問題(在擴展名之前忘記'。'是常見的錯誤)。

如果你想枚舉立即執行,而不是被推遲(使調試容易)剛剛結束與一個.ToList(你LINQ表達式),像這樣的最簡單的方法:

var files = dir.EnumerateFiles("*.*", SearchOption.AllDirectories) 
    .Where(f => ext.Contains(Path.GetExtension(f.FullName))) 
    .ToList(); 
+0

我將不得不閱讀延期執行。這絕對解決了它。謝謝。 –