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

时间:2011-11-30 17:27:10

标签: c# parallel-processing

我想增加特定值的索引,例如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次操作(作为顺序),顺序对我来说无关紧要。

5 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:3)

看起来你想要迭代值0到10,增量为2.为什么不像下面那样实现它:

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

答案 2 :(得分:3)

如果您尝试执行相当于步长的操作,那么这篇文章可能有所帮助:

Parallel.For step size

如果您只想省略某个值,则只需忽略它。

Parallel.For不会按顺序运行项目,因此i += 2毫无意义。

答案 3 :(得分: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)的投影。任意sr

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

答案 4 :(得分:1)

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

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