如何在 LINQ 的 where 子句中更新全局变量?
How to update a global variable inside `where` clause in LINQ?
我想使用 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);
大家可以看到我设置了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
方法的谓词在实际枚举列表之前不会被评估。
我想使用 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);
大家可以看到我设置了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
方法的谓词在实际枚举列表之前不会被评估。