2011-11-30 51 views
7

我想增加一個特定值的索引,例如2:如何在Parallel.For中增加一個特定值的索引?

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個操作(作爲順序)和順序對我來說並不重要。

+0

在這種情況下,增量也被稱爲*步幅*。 – user7116

+1

[Parallel.For step size]的可能重複(http://stackoverflow.com/questions/7142446/parallel-for-step-size) – user7116

回答

7

第一個循環中的隱含假設是j按順序遞增。
在第二個示例中,j的值可以是任何循環中的0 - > 9。

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

它看起來像要遍歷值0至10,爲2的增量爲什麼不實現它像下面這樣::

您可以通過以下實現相同的行爲

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

這不是你所描述的。這產生的值從0到18,增量爲2. –

+0

@SaniHuttunen嗨Sani,很好的觀察,忘了把上限改爲10到5,現在更正:) – Lukazoid

2

一個簡單的適應:

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

換句話說,你幾乎可以alays網絡找出從連續的i到期望的循環值(j)的投影。 rbitrary sr

這裏的另一個利益相關者是分區器,你不能指望它處理任意序列。

3

如果你正在試圖做的步長相當於,那麼這篇文章可以幫助:

Parallel.For step size

如果你只是想省略一定值時你只需要忽略它。

Parallel.For不會按順序運行項目,所以i += 2是沒有意義的。

+0

+1。最後一個聲明應該是「Parallel.For可能不會按順序運行」,因爲它有可能。 –

1

另一種方法是使用WHERE子句:

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