2011-11-30 35 views
7

Tôi muốn tăng một chỉ mục trên một giá trị cụ thể, ví dụ 2:Làm cách nào để tăng chỉ mục trên một giá trị cụ thể trong Parallel.For?

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

Làm thế nào để làm điều tương tự bằng cách sử dụng lớp Parallel, như:

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

Sửa

Tôi muốn vòng lặp Parallel chỉ chạy 5 thao tác (như tuần tự cho) và thứ tự không quan trọng đối với tôi.

+0

Các increment trong trường hợp này cũng được gọi là * sải chân *. – user7116

+1

có thể trùng lặp của [Parallel.For step size] (http://stackoverflow.com/questions/7142446/parallel-for-step-size) – user7116

Trả lời

7

Giả định ngầm định trong vòng lặp đầu tiên là j được tăng tuần tự.
Trong ví dụ thứ hai, giá trị của j có thể là bất kỳ 0 -> 9 trong bất kỳ vòng lặp nào.

Bạn có thể đạt được các hành vi tương tự bằng cách sau:

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

Có vẻ như bạn muốn để lặp qua các giá trị từ 0 đến 10, với một tăng của 2. Tại sao không thực hiện nó như sau:

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

Đây không phải là những gì bạn mô tả. Điều này mang lại giá trị từ 0 đến 18 với gia số 2. –

+0

@SaniHuttunen Hi Sani, quan sát tốt, quên thay đổi giới hạn trên của 10 đến 5, sửa ngay bây giờ :) – Lukazoid

2

Một thích ứng đơn giản:

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

Nói cách khác, bạn có thể hầu như alays fi nd chiếu từ tuần tự i đến vòng lặp mong muốn (j). rbitrary sr

Chủ sở hữu cổ phần khác ở đây là trình phân vùng, bạn không thể mong đợi nó xử lý các chuỗi tùy ý.

3

Nếu bạn đang cố gắng để làm tương đương với kích thước bước, sau đó bài viết này có thể giúp:

Parallel.For step size

Nếu bạn chỉ muốn bỏ qua một giá trị nhất định bạn sẽ chỉ cần bỏ qua nó.

Parallel.For sẽ không chạy các mục theo thứ tự, vì vậy i += 2 là vô nghĩa.

+0

+1. Câu lệnh cuối cùng nên là "Parallel.For có thể sẽ không chạy các mục theo thứ tự" vì có khả năng nó sẽ xảy ra. –

1

cách tiếp cận khác sẽ được sử dụng mệnh đề where:

Parallel.ForEach(Enumerable.Range(0, 10).Where(i => i % 2 == 0), i => 
{ 
    Console.WriteLine(i); 
}); 
Các vấn đề liên quan