为什么方法不能在LINQ中执行Where方法

时间:2016-01-10 23:34:46

标签: c# linq

在控制台应用程序中,我从主类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?

2 个答案:

答案 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();