重置布尔列表

Reset Boolean List

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

private List<bool> _IsSet = new List<bool>();
public void ClearIsSet()
{
    _IsSet.ForEach(x => x = false);
}

调用 ClearIsSet 后,true 值仍在列表中。

我知道我可以让它在 for 循环中工作。

有没有办法在没有 for 循环的情况下完成这项工作?如果不是,为什么不呢?

编辑:

写完这个扩展函数,我就没有用了

[Extension()]
public IList<T> ReplaceAll<T>(IList<T> Source, T Value)
{
    IList<T> Replacement = Source.Select(x => Value).ToList();
    Source.Clear();
    Source.AddRange(Replacement);
    return Source;
}

我刚用过:

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

ForEach takes an Action and performs the Action on each item in the List.

一个 Action returns 没有值。您在示例代码中所做的基本上是使用一个临时参数 x,并将其分配给一个新值。这个变量 x 只是从 List 接收值;它不是对 List 中值的引用,因为 bool 不是引用类型。为您的参数变量分配一个新值 x 对原始列表值没有影响,不会超过如果您为代码中其他地方的方法参数分配一个新值。

即使 bool 是引用类型,ForEach 也不会将任何值分配回列表中的那个位置。您可以改变 List 中的可变对象,但不能替换 List.

中的值

您可能正在寻找的函数是 IEnumerable<T>.Select。它接受一个从 IEnumerable 的元素类型映射到某种新类型的函数,以及 returns 一个包含转换元素的 IEnumerable