2011-11-30 25 views
7

Quiero incrementar un índice en un valor determinado, por ejemplo 2:¿Cómo incrementar el índice en un valor particular en Paralelo.Para?

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

¿Cómo puedo hacer lo mismo con la clase Parallel, como:

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

Editar

Me gustaría que el ciclo Parallel ejecute solo 5 operaciones (como secuenciales para) y el orden no me importa.

+0

El incremento en este caso también se conoce como la zancada * *. – user7116

+1

posible duplicado de [Parallel.For step size] (http://stackoverflow.com/questions/7142446/parallel-for-step-size) – user7116

Respuesta

7

La suposición implícita en el primer ciclo es que j se incrementa secuencialmente.
En el segundo ejemplo, el valor de j puede ser cualquiera de 0 -> 9 en cualquiera de los bucles.

Puede lograr el mismo comportamiento por lo siguiente:

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

Parece como si desea iterar sobre los valores de 0 a 10, con un incremento de 2. ¿Por qué no ponerlo en práctica como la siguiente:

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

Esto no es lo que usted describe. Esto arroja valores de 0 a 18 con un incremento de 2. –

+0

@SaniHuttunen Hola Sani, buena observación, se olvidó de cambiar el límite superior de 10 a 5, corregido ahora :) – Lukazoid

2

Una adaptación sencilla:

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

En otras palabras, casi se puede fi diversión asegurada nd una proyección desde el i secuencial al valor de bucle deseado (j). rbitrary sr

El otro stakeholder aquí es el particionador, no se puede esperar que maneje secuencias arbitrarias.

3

Si usted está tratando de hacer el equivalente del tamaño del paso, entonces este post puede ayudar a:

Parallel.For step size

Si lo que desea omitir un cierto valor que sólo tendrá que ignorarlo.

El Parallel.For no ejecutará los elementos en orden, por lo que i += 2 no tiene sentido.

+0

+1. La última declaración debería ser "The Parallel.For probablemente no ejecutará los elementos en orden" ya que existe la posibilidad de que así sea. –

1

Otro enfoque sería el uso de la cláusula where:

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