2011-09-26 78 views
1

在下面的代碼foreach循環工作正常,但是當我嘗試使用LINQ而不是使用foreach它不起作用無例外沒有錯誤。想要使用LINQ而不是foreach,但它不起作用

此代碼工作:

public static IEnumerable<PatternInfo> LoadPatterns() { 
     var directoryInfo = new DirectoryInfo(PatternFullPath); 
     var dirs = directoryInfo.EnumerateDirectories(); 
     var result = new List<PatternInfo>(); 
     foreach (var info in dirs) 
     { 
      result.Add(new PatternInfo 
          { 
           PatternName = info.Name, 
           TemplateFileNames = GetTemplateFiles(info.FullName) 
          }); 
     } 
     return result; 
    } 

但是這一次沒有:

public static IEnumerable<PatternInfo> LoadPatterns() { 
     var directoryInfo = new DirectoryInfo(PatternFullPath); 
     var dirs = directoryInfo.EnumerateDirectories(); 
     var patterns = dirs.Select(info => new PatternInfo { 
      PatternName = info.Name, 
      TemplateFileNames = GetTemplateFiles(info.FullName) 
     }); 
     return patterns; 
    } 

任何意見將是有益的。

+2

當你說沒有例外,沒有錯誤,究竟發生了什麼?當你摺疊它時,你有一個枚舉值爲0的項目? – Tejs

+1

直到您需要linq查詢纔會執行,PatternFullpath可能在您使用IEnumerable時發生了更改。做一個patterns.ToList(),看看是否解決了你的問題。 –

回答

6

兩者之間的區別在於,在第一個代碼示例中,您有一個List<PatternInfo>,列表中的所有項目都已填充 - 然後您將此列表返回爲IEnumerable<PatternInfo>

在第二個例子中,你有一個IEnumerable<PatternInfo> - 這個時候你遍歷枚舉首次將只加載模式。

如果你想在第二個版本是等價的(模式的預先加載),然後添加一個ToList()

return patterns.ToList(); 
+0

什麼錯誤:P,我忘了LINQ是懶惰的,非常感謝你。 :d – saber

2

好,可枚舉是懶惰的,直到有人開始列舉了他們,所以:

foreach (var item in LoadPatterns()) 
{ 
    ... 
} 

.Select聲明在你的第二個例子只是返回一個新IEnumerable<T>但直到有一些消耗/代碼將遍歷這個枚舉什麼都不會真正執行。

1

LINQ被推遲執行。您將返回該聲明,但只有在您要返回的IEnumerable之前進行迭代時纔會對其進行評估。什麼是調用LoadPatterns()的代碼?

相關問題