2012-10-21 19 views
5

Sto creando un array con il seguente CreateArray metodo statico:Refactor LINQ ForEach per tornare IEnumerable <T>

public static int[] CreateArray(int size) 
{ 
    var ret = new int[size]; 
    ret[0] = 0; 
    ret[1] = 1; 

    Parallel.ForEach(Enumerable.Range(2, size - 2), i => 
    { 
     ret[i] = Func(i).Count(); 
    }); 

    return ret; 
} 

Dove Func assomiglia:

public static IEnumerable<int> Func(int i) 
{ 
    ... 
} 

E 'possibile refactoring il metodo CreateArray in qualcosa come:

public static int[] CreateArray(int size) 
{ 
    var tableFromIndex2 = ... 
    return new[] { 0, 1 } 
     .Concat(tableFromIndex2) 
     .ToArray(); 
} 

risposta

1

Penso PL INQ potrebbe essere utile qui:

var tableFromIndex = ParallelEnumerable.Range(2, size - 2) 
     .AsOrdered() 
     .Select(i => Func(i).Count()); 

return new[] { 0, 1 } 
     .Concat(tableFromIndex) 
     .ToArray(); 
+0

Ehi svick, ho pensato che fosse giusto, ma in realtà ho ottenuto i risultati non ordinati da 'i'. Voglio dire, sto bene per eseguire 'Func (i) .Count()' in parallelo, ma il risultato dovrebbe essere collocato nella posizione 'i' ... –

+0

Hai ragione, ho dimenticato' AsOrdered() ' . Risolto ora. – svick

+0

Grazie svick, non so che 'AsOrdered()' esiste –

Problemi correlati