在下面的代码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;
}
任何建议都会有所帮助。
答案 0 :(得分:6)
两者之间的区别在于,在第一个代码示例中,您有一个List<PatternInfo>
,列表中的所有项目都已填充 - 然后您将此列表作为IEnumerable<PatternInfo>
返回。
在第二个示例中,您有一个IEnumerable<PatternInfo>
- 这只会在您第一次迭代枚举时加载模式。
如果您希望第二个版本相同(急切加载模式),请添加ToList()
:
return patterns.ToList();
答案 1 :(得分:2)
嗯,在有人开始枚举它们之前,可枚举是懒惰的,所以:
foreach (var item in LoadPatterns())
{
...
}
第二个示例中的.Select
语句只返回一个新的IEnumerable<T>
,但是直到有一些代码消耗/循环这个枚举,实际上什么都不会执行。
答案 2 :(得分:1)
LINQ是延迟执行。您将返回该语句,但在您执行某些操作以迭代您返回的IEnumerable
之前,它不会被评估。调用LoadPatterns()
的代码是什么?