我想用LINQ代替foreach,但它不工作
本文关键字:工作 foreach LINQ 代替 | 更新日期: 2023-09-27 18:09:38
在以下代码中,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;
}
两者之间的区别在于,在第一个代码示例中,您有一个List<PatternInfo>
,列表中的所有项都已填充-然后您将此列表返回为IEnumerable<PatternInfo>
。
在第二个例子中,你有一个IEnumerable<PatternInfo>
-这只会在你第一次迭代枚举时加载模式。
如果您希望第二个版本相同(模式的即时加载),则添加ToList()
:
return patterns.ToList();
可枚举对象是懒惰的,除非有人开始枚举它们,所以:
foreach (var item in LoadPatterns())
{
...
}
第二个示例中的.Select
语句只是返回一个新的IEnumerable<T>
,但是直到有一些代码在这个可枚举对象上使用/循环之前,实际上什么都不会执行。
LINQ被延迟执行。您正在返回语句,但是直到您对返回的IEnumerable
进行迭代之前,它不会得到评估。调用LoadPatterns()
的代码是什么?