我做了一个扩展,它在ObservableCollection上添加了ForEach()方法:
public static void ForEach<T>(this ObservableCollection<T> enumerable, Action<T> action)
{
foreach (var item in enumerable)
action(item);
}
当我使用它时,像这样:
private bool Bar(int i)
{
return i % 2 == 1;
}
private void Foo()
{
Boolean ok = true;
ObservableCollection<int> oc = new ObservableCollection<int> { 1, 2, 3, 4 };
oc.ForEach(i => ok &= Bar(i));
//ok is now false
}
我不明白ok
布尔值如何取Bar()
执行的action(item)
方法返回的值?
答案 0 :(得分:2)
允许Lambdas修改其体内代码范围内的变量。你需要非常小心这种代码,因为你并不总是完全控制执行lambda的时间。
例如,如果将一个赋值添加到传递给具有延迟执行的方法的lambda,那么该lambda的副作用(即赋值)在该lambda的代码实际执行之前将不可见。 / p>
以下是一个例子:
bool ok = true;
IEnumerable<int> res = new[] {1, 2, 3}.Where(i => ok &= (i == 2));
// ok is true here
IList<int> listRes = res.ToList();
// ok is false here
如果您运行此代码,ok
将保持true
,即使源列表的第一项会触发false
到ok
变量的分配。但是,在您枚举res
之前,这不会发生。
答案 1 :(得分:0)
你正在应用&amp; =哪个会和每个结果都带有ok的previos值(因为ok不是单个循环迭代的本地结果,它是在循环之外声明的)。换句话说,
因为条件仅适用于两个值(1和3)
ok = true&amp;&amp;虚假&amp;&amp;真实&amp;&amp;假
这是假的。