重置布尔列表
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
。
我惊讶地发现以下代码不起作用:
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
。