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
的项目,您可以这样做。您还可以查看是否有任何结果,并“告诉”是否找到了。