如何在Parallel.For中增加特定值的索引

本文关键字:索引 增加 Parallel For | 更新日期: 2023-09-27 18:16:38

我想增加一个特定值的索引,例如2:

for (int i = 0; i < 10; i+=2)
{
    Console.WriteLine(i);
}

我如何使用Parallel类做同样的事情,如:

Parallel.For(0, 10, i =>
{
    Console.WriteLine(i);
    i += 2; //this a naïve assumption, it's not working
});

编辑

我希望Parallel循环只运行5个操作(作为顺序for),顺序对我来说无关紧要。

如何在Parallel.For中增加特定值的索引

在第一个循环中隐含的假设是j是顺序递增的。
在第二个例子中,j的值可以是任意循环中0 -> 9的任意值。

您可以通过以下方式实现相同的行为:

Parallel.ForEach(Enumerable.Range(0, 5).Select(i => i*2), i =>
{
  Console.WriteLine(i);
});

看起来您想迭代0到10的值,增量为2。为什么不像下面这样实现呢?

Parallel.For(0, 5, i =>
{
    int value = i * 2;
    Console.WriteLine(value);
});

如果你正在尝试做与步长相当的事情,那么这篇文章可能会有所帮助:

平行。对于步长

如果你只是想省略某个值,你只需要忽略它。

平行。For不按顺序运行,所以i += 2是没有意义的。

一个简单的改编:

Parallel.For(0, 5, i =>
{
    int j = i * 2;
    Console.WriteLine(j);
    // i += 2; //this a naïve assumption, it's not working
});

换句话说,您几乎总能找到从顺序i到期望的环值(j)的投影。rbitrary sr

这里的另一个利益相关者是分区者,你不能指望它处理任意序列

另一种方法是使用where子句:

Parallel.ForEach(Enumerable.Range(0, 10).Where(i => i % 2 == 0), i =>
{
    Console.WriteLine(i);
});