【问题标题】:Parallel LINQ - .Select() + .ForAll() returning bizarre results并行 LINQ - .Select() + .ForAll() 返回奇怪的结果
【发布时间】:2015-05-26 23:57:53
【问题描述】:

对于我的生活,我无法弄清楚为什么所有的 foos 都不为空。 我假设在调用.All() 方法之前应该执行.ForAll(),但不是吗?

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 ??
}

【问题讨论】:

    标签: c# plinq


    【解决方案1】:

    当你这样做时

    newFoos.ForAll(x => x = null);
    

    您将null 分配给x,这是您的lambda 参数。 x 是 lambda 本地的。它不是ref 参数,给它赋值对它的主体之外没有任何影响。实际上,这条线什么都不做。

    【讨论】:

    • 即使我修改 lambda 的主体以将 Bar 属性设置为另一个值,该值也不会保持不变。我还是有点困惑;我假设ForAll() 正在遍历实际列表。换句话说,为什么 lambda not 会是 ref
    • 现在我想起来了,这甚至与 PLINQ 没有任何关系……这与 .ForEach() 的行为相同。
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多