【问题标题】:How to initialize large array parallel with PLINQ?如何初始化与 PLINQ 并行的大数组?
【发布时间】:2015-06-19 16:38:08
【问题描述】:

我正在尝试使用 PLINQ 初始化一个简单(但很大)的数组:

void Test(int width, int height)
{
    var foo = new Foo[width * height];
    foo.AsParallel().ForAll(c => new Foo());
}

但这会给我留下一个宽度 x 高度为空(未初始化)元素的数组。

这肯定是可能的,因为这个操作可以简单地瘫痪(?)。

使用 PLINQ 执行初始化的正确语法是什么?

【问题讨论】:

  • ForAll 接受Action 委托,而不是Func,新创建的Foo 不会被分配回相关的数组元素。
  • @NathanA:感谢您指出这一点。不知何故,我似乎常常会错过这个小的句法但至关重要的细节。

标签: c# parallel-processing plinq


【解决方案1】:

我不怀疑有一种方法可以使用 LINQ 并行初始化数组,但是,我建议简单地使用 Parallel.For 来代替:

var foo = new Foo[width * height];
Parallel.For(0, foo.Length, i => foo[i] = new Foo());

编辑:因为您想要一个合适的 PLINQ 解决方案(另外,正如您指出的那样,修复了错字):

var foo = Enumerable.Range(0, width * height)
                    .AsParallel()
                    .Select(x => new Foo())
                    .ToArray();

【讨论】:

  • 它是真的,但它不是 plinq,它的 tpl
  • @M.kazemAkhgary 有时 OP 要求的不是 OP 需要的 :)
  • 好的,虽然这解决了我的实际问题,但我会为 PLINQ 的解决方案留下积分:)
  • @Stefan:也更新了 PLINQ 答案。
  • 是的。 foo.Countwidth * height。不错@willaien
猜你喜欢
  • 2017-11-25
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2014-04-21
  • 1970-01-01
相关资源
最近更新 更多