并行 LINQ - .Select() + .ForAll() 返回奇怪的结果
Parallel LINQ - .Select() + .ForAll() returning bizarre results
我这辈子都弄不明白为什么所有的 foo 都不为空。
我假设 .ForAll()
应该在我调用 .All()
方法之前执行,但事实并非如此?
public class Foo
{
public string Bar { get; set; }
}
static void Main(string[] args)
{
var foos = new List<Foo> { new Foo(), new Foo(), new Foo() };
var newFoos = foos
.AsParallel()
.Select(x =>
{
x.Bar = "";
return x;
});
newFoos.ForAll(x => x = null);
var allFoosAreNull = newFoos.All(x => x == null);
Console.WriteLine(allFoosAreNull); // False ??
}
当你这样做时
newFoos.ForAll(x => x = null);
您正在将 null
分配给 x
,这是您的 lambda 的参数。 x
是 lambda 的局部变量。它不是 ref
参数,并且为其赋值在其主体之外没有任何效果。实际上,该行什么都不做。
我这辈子都弄不明白为什么所有的 foo 都不为空。
我假设 .ForAll()
应该在我调用 .All()
方法之前执行,但事实并非如此?
public class Foo
{
public string Bar { get; set; }
}
static void Main(string[] args)
{
var foos = new List<Foo> { new Foo(), new Foo(), new Foo() };
var newFoos = foos
.AsParallel()
.Select(x =>
{
x.Bar = "";
return x;
});
newFoos.ForAll(x => x = null);
var allFoosAreNull = newFoos.All(x => x == null);
Console.WriteLine(allFoosAreNull); // False ??
}
当你这样做时
newFoos.ForAll(x => x = null);
您正在将 null
分配给 x
,这是您的 lambda 的参数。 x
是 lambda 的局部变量。它不是 ref
参数,并且为其赋值在其主体之外没有任何效果。实际上,该行什么都不做。