2012-10-21 29 views
5

Tôi đang tạo ra một mảng với những điều sau CreateArray phương pháp tĩnh:Refactor LINQ ForEach trở về 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; 
} 

đâu Func trông giống như:

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

Có thể cấu trúc lại các phương pháp CreateArray trong một cái gì đó như:

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

Trả lời

1

Tôi nghĩ PL INQ có thể hữu ích ở đây:

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

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

Hey svick, tôi nghĩ nó đúng nhưng thực ra tôi đã nhận được kết quả không được đặt hàng bởi 'i'. Tôi có nghĩa là, tôi OK để chạy 'Func (i) .Count()' song song nhưng sau đó kết quả nên được đặt ở vị trí 'i' ... –

+0

Bạn nói đúng, tôi quên' AsOrdered() ' . Đã sửa lỗi. – svick

+0

Cảm ơn svick, tôi không biết 'AsOrdered()' tồn tại –

Các vấn đề liên quan