2011-09-26 34 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()的代码?

相关问题