2011-08-22 37 views
8

¿Alguien sabe si hay alguna sobrecarga que me permita especificar un tamaño de paso en un bucle Parallel.For? Las muestras en C# o VB.Net serían geniales.Paralelo.Para el tamaño de paso

Gracias, Gonzalo

Respuesta

15

Google de "paso enumerable.range" y que debe ser capaz de venir sobre implementaciones alternativas de Enumerable.Range que proporcionan intervalos escalonados. A continuación, sólo se puede hacer un

Parallel.ForEach(BetterEnumerable.SteppedRange(fromInclusive, toExclusive, step), ...) 

Si Google no está funcionando, la aplicación debe ser algo como esto:

public static class BetterEnumerable { 
    public static IEnumerable<int> SteppedRange(int fromInclusive, int toExclusive, int step) { 
     for (var i = fromInclusive; i < toExclusive; i += step) { 
      yield return i; 
     } 
    } 
} 

Alternativamente, si "yield return" da a uno la jeebies heebie, siempre puede cree una lista vieja normal en el lugar:

var list = new List<int>(); 
for (int i = fromInclusive; i < toExclusive; i += step) { 
    list.Add(i); 
} 
Parallel.ForEach(list, ...); 

Esto se debe traducir fácilmente a VB si eso es un requisito.

+0

Gracias Dax. ¿Sería demasiado trabajo adicional si estoy tratando de hacer esto en VB.Net donde no hay retorno de rendimiento? – Gonzalo

+0

Sin experiencia VB, pero debería poder usar un bucle for para hacer una lista de enteros con los enteros que necesita, y luego usar 'Parallel.ForEach' con esa lista. –

+0

@Gonzalo: [async CTP] (http://www.microsoft.com/download/en/details.aspx?id=22388) habilita el uso de iteradores en VB.NET. – jason

Cuestiones relacionadas