如何在 LINQ 的 where 子句中更新全局变量?

How to update a global variable inside `where` clause in LINQ?

我想使用 LINQWhere 扩展方法来过滤列表。但除了过滤之外,我还想更新 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);

大家可以看到我设置了flag = true,执行后还是flag == false的值。这对我来说没有意义。你能解释一下幕后发生的事情以及为什么 flag 没有改变吗?还有一种方法可以完全更改 LINQ 中的全局变量吗?

Linq 查询是惰性的,所以在您枚举 newList 之前您不会看到任何变化,因为您的 where 还没有被执行。

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

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

Console.WriteLine(flag); // Flag is still false.

foreach (var item in newList) {
  // It doesn't matter what we do here, just that we enumerate the list.
}

Console.Write(flag); // Flag is now true.

foreach 导致执行位置并设置您的标志。

顺便说一句,我真的建议不要使用 where 谓词来产生副作用,但这就是您的做法。

只需调用 ToArray()ToList() 即可实际执行设置 flag:

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

您传递给 Where 方法的谓词在实际枚举列表之前不会被评估。