C# 如何更新LINQ中'where'子句中的全局变量?

C# 如何更新LINQ中'where'子句中的全局变量?,c#,.net,linq,where,extension-methods,C#,.net,Linq,Where,Extension Methods,我想使用LINQ和Where扩展方法过滤列表。但是除了过滤之外,我还想更新Where中的一个全局变量。但是我做不到。考虑这个例子: var list = new List<string> { "1", "2", "3", "4", "5" }; bool flag = false; var newList = list.Where(item => { flag = true; return item == "2"; }); // Here I expect

我想使用
LINQ
Where
扩展方法过滤列表。但是除了过滤之外,我还想更新
Where
中的一个全局变量。但是我做不到。考虑这个例子:

var list = new List<string> { "1", "2", "3", "4", "5" };

bool flag = false;
var newList = list.Where(item =>
{
    flag = true;
    return item == "2";
});

// Here I expect flag = true, but in fact it's false
Console.Write(flag);
var list=新列表{“1”、“2”、“3”、“4”、“5”};
布尔标志=假;
var newList=list.Where(项=>
{
flag=true;
返回项目==“2”;
});
//这里我期望flag=true,但实际上它是false
控制台。写入(标志);

正如您所看到的,我设置了
flag=true
,在执行之后仍然是值
flag==false
。这对我来说毫无意义。你能解释一下引擎盖下面发生了什么事情,以及为什么
标志没有改变吗。还有一种方法可以更改
LINQ
中的全局变量吗?

LINQ查询是惰性的,因此在枚举newList之前,您不会看到更改,因为您的where尚未执行

var list=新列表{“1”、“2”、“3”、“4”、“5”};
布尔标志=假;
var newList=list.Where(项=>
{
flag=true;
返回项目==“2”;
});
Console.WriteLine(标志);//旗帜仍然是假的。
foreach(新列表中的变量项){
//我们在这里做什么并不重要,只是我们列举清单。
}
控制台。写入(标志);//旗帜现在是真的。
foreach导致where执行并设置您的标志

顺便说一句,我真的建议不要使用where谓词来创建副作用,但这是您应该做的。

只需调用
ToArray()
ToList()
即可实际执行设置
标志的代码:

var newList = list.Where(item =>
{
    flag = true;
    return item == "2";
}).ToArray();

传递给
的谓词,其中
方法在实际枚举列表之前不会计算。

LINQ中的Q表示查询(读取),不用于设置值。WHERE也不返回值。您的实际需求是什么?您希望基于现有列表返回一个新列表,WHERE What?您的方法可以工作,但谓词永远不会执行,因为您没有枚举
newList
。但是我也建议不要在where谓词中使用副作用。
where
过滤器。因此,如果您想要一个
==2
的项目,您可以这样做。您还可以查看是否有任何结果,并“告诉”是否找到了。