Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么赢了';t方法从LINQ Where方法中执行_C#_Linq - Fatal编程技术网

C# 为什么赢了';t方法从LINQ Where方法中执行

C# 为什么赢了';t方法从LINQ Where方法中执行,c#,linq,C#,Linq,在控制台应用程序中,我从主类程序中的静态方法调用: internal class Module { public bool EnsureModuleLocalInstall() { if (CheckModuleUpToDateLocal()) return true; else if (DownloadComponentData()) if(InstallModuleLocal())

在控制台应用程序中,我从主类程序中的静态方法调用:

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());
内部类模块
{
public bool EnsuleModuleLocalInstall()
{
if(CheckModuleUpToDateLocal())
返回true;
else if(下载组件数据())
if(InstallModuleLocal())
返回true;
返回false;
}
}
var availableModules=新列表();
... // 在列表中添加几个“模块”
var installed=availableModules.Where(m=>m.EnsureModuleLocaliInstall());
我既设置了断点,也检查了预期结果(本地安装了模块),但从所有迹象来看,没有执行“EnsureRemouleLocalinstall”方法


我是否遗漏了一些明显的东西,或者我对LINQ'Where'方法的期望过高,应该使用LINQ ForEach?

使用
Where
方法实现,因此在迭代结果之前不会实际运行查询。获取已安装模块列表的最简单方法是调用查询返回值上的
ToList

var installed = availableModules.Where(m => m.EnsureModuleLocalInstall()).ToList();
大多数LINQ方法(如
Where
方法)将返回给您
IEnumerable
的实现,该实现不包含查询结果,而是包含执行查询所需的所有信息。只有在开始枚举
IEnumerable
时,才会执行查询。这称为延迟执行

枚举
IEnumerable
的一种方法是调用
ToList
,如下所示:

var installed = availableModules.Where(m => m.EnsureModuleLocalInstall()).ToList();

你明白吗?一般来说,LINQ不适合定义和运行有副作用的查询。。当您定义查询时,您希望调用该方法,这并不奇怪。是的,谢谢。尴尬-我所需要做的就是添加一个ToList()。谢谢Sam,是的,正如Jesse Good指出的那样-它被推迟了,而且从未执行过。推迟执行是懒惰评估或懒惰的同义词。在计算上下文中,它也称为符号计算