.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));