static void Main(string[] args)
{
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, };
var factorials = from n in numbers.AsParallel()
select Factorial(n);
foreach (var n in factorials)
Console.WriteLine(n);
Console.ReadLine();
}
static int Factorial(int x)
{
int result = 1;
for (int i = 1; i <= x; i++)
{
result *= i;
}
Console.WriteLine($"{x} sonining faktoriali {result} ga teng.");
return result;
}
Aslida, bu oddiy LINQ so'rovi, ma'lumotlar manbasiga faqat AsParallel usuli qo'llaniladi.Dastur ishining natijasi faktorialni topish uchun ma'lumotlar ketma-ket tanlanmaganligini ko'rsatadi. Ya'ni, dasturning parallellashuvi mavjud edi:
Kengaytma usullaridan foydalangan holda shunga o'xshash operatsiya:
var factorials = numbers.AsParallel().Select(x => Factorial(x));
For All usuli. Faktorialni hisoblash uchun yuqoridagi kod parallellashtirish nuqtai nazaridan yanada optimallashtirilishi mumkin. Xususan, parallel amal natijasini ko'rsatish uchun foreach siklidan foydalaniladi. Ammo undan foydalanish xarajatlarning oshishiga olib keladi - turli xil oqimlarda olingan ma'lumotlarni bitta to'plamga yopishtirish va keyin ularni tsiklda takrorlash kerak. Bu holda, ma'lumotlarni qayta ishlangan oqimda chiqaradigan ForAll() usulidan foydalanish maqbulroq bo'ladi:
int[] numbers = new int[] { -2, -1, 0, 1, 2, 4, 3, 5, 6, 7, 8, };
(from n in numbers.AsParallel()
where n >0
select Factorial(n))
.ForAll(Console.WriteLine);
ForAll() usuli parametr sifatida Action delegatini oladi, bu bajariladigan amalni bildiradi.
Do'stlaringiz bilan baham: |