在控制台应用程序中,我从主类Program中的静态方法调用:
internal class Module
{
public bool EnsureModuleLocalInstall()
{
if (CheckModuleUpToDateLocal())
return true;
else if (DownloadComponentData())
if(InstallModuleLocal())
return true;
return false;
}
}
var availableModules = new List<Module>();
... // Add several 'Modules' to list
var installed = availableModules.Where(m => m.EnsureModuleLocalInstall());
我既设置了一个断点,又检查了预期的结果(本地安装的模块),但是从所有指示中都没有执行'EnsureModuleLocalInstall'方法。
我是否遗漏了一些明显的东西,或者我对LINQ'Fhere'方法的期望过高而应该使用LINQ ForEach?
答案 0 :(得分:3)
使用deferred execution实现Where
方法,因此在迭代结果之前,实际上不会运行查询。获取已安装模块列表的最简单方法是在查询返回值上调用ToList
:
var installed = availableModules.Where(m => m.EnsureModuleLocalInstall()).ToList();
答案 1 :(得分:3)
大多数LINQ方法(如Where
方法)将返回IEnumerable<T>
的实现,该实现不包含查询结果,而是包含执行查询所需的所有信息。只有在开始枚举IEnumerable<T>
时才会执行查询。这称为延期执行。
枚举IEnumerable<T>
的一种方法是像这样调用ToList
:
var installed = availableModules.Where(m => m.EnsureModuleLocalInstall()).ToList();