.net 重置布尔列表

.net 重置布尔列表,.net,generic-list,.net,Generic List,我惊讶地发现以下代码不起作用: private List<bool> _IsSet = new List<bool>(); public void ClearIsSet() { _IsSet.ForEach(x => x = false); } 我刚才用过: _IsSet = _IsSet.Select(x => false).ToList() 因为Select实际上是一个流畅的链中的ReplaceAll 然而,你可以说: _IsSet.Repla

我惊讶地发现以下代码不起作用:

private List<bool> _IsSet = new List<bool>();
public void ClearIsSet()
{
    _IsSet.ForEach(x => x = false);
}
我刚才用过:

_IsSet = _IsSet.Select(x => false).ToList()
因为
Select
实际上是一个流畅的链中的
ReplaceAll

然而,你可以说:

_IsSet.ReplaceAll(false);

虽然您不能使用
Select
,但是
ReplaceAll
中的代码似乎很麻烦。

foreach循环为其迭代器变量创建一个本地副本,并为该副本分配一个新值。这不会更改列表中的元素

你可以用

_IsSet = Enumerable.Repeat(false, _IsSet.Count).ToList();
或者,如果您需要确切的列表实例:

var count = _IsSet.Count;
_IsSet.Clear();
_IsSet.AddRange(Enumerable.Repeat(false, count));

操作
不返回任何值。您在示例代码中所做的基本上是获取一个临时参数,
x
,并将其赋给一个新值。此变量
x
仅从
列表中接收值;它不是对
列表中的值的引用,因为
bool
不是引用类型。为参数变量
x
指定一个新值不会对原始列表值产生影响,就像为代码中其他地方的方法参数指定一个新值一样

即使
bool
是引用类型,
ForEach
也不会将任何值赋回到列表中的该位置。您可以变异
列表中的可变对象,但不能替换
列表中的值


您可能正在寻找的功能是。它接受一个从
IEnumerable
的元素类型映射到某个新类型的函数,并返回一个包含转换元素的
IEnumerable

它与i是值类型这一事实无关;它对引用类型也不起作用。这是因为lambda的参数是通过值传递的,而不是通过引用。因此代码应该是
\u IsSet=\u IsSet.Select(b=>false)
?实际上
\u IsSet=\u IsSet.Select(Function(x)false)。ToList
var count = _IsSet.Count;
_IsSet.Clear();
_IsSet.AddRange(Enumerable.Repeat(false, count));