Yield return: qaytish elementini belgilaydi yield break


Download 63.55 Kb.
bet2/7
Sana24.12.2022
Hajmi63.55 Kb.
#1062569
1   2   3   4   5   6   7
Bog'liq
tsfcsOQYNmo1EkP9FeO7k5euCfrh5g2v

GetEnumerator () usuli iteratorni ifodalaydi. Va biz foreach tsiklida kompaniya ob'ektida ro'yxatga olishni amalga oshirganimizda, hosilning yield return personnel[i];qo'ng'irog'iga murojaat qilinadi. Hosil qaytish bayonotiga kirishda joriy manzil saqlanib qoladi. Va foreach usuli yangi ob'ektni olish uchun keyingi iteratsiyaga o'tganda, iterator shu joydan bajarishni boshlaydi.
Xo'sh, foreach tsiklidagi asosiy dasturda iteratorni amalga oshirish tufayli haqiqiy ro'yxatga olish amalga oshiriladi:
__________________________________________________________________
var people = new Person[]
{
new Person("Tom"),
new Person("Bob"),
new Person("Sam")
};
var microsoft = new Company(people);
foreach(Person employee in microsoft)
{
Console.WriteLine(employee.Name);
}
__________________________________________________________________
Getenumerator() usulida iteratorni amalga oshirishda for loopida massivni takrorlash ishlatilgan bo'lsa-da, lekin buni qilish shart emas. Biz faqat bir nechta qo'ng'iroqlarni aniqlay olamiz:
__________________________________________________________________
public IEnumerator
GetEnumerator()
{
yield return personnel[0];
yield return personnel[1];
yield return personnel[2];
}
__________________________________________________________________
Bunday holda, har bir "qaytish rentabelligi" iborasi chaqirilganda, iterator joriy manzilni eslab qoladi va keyingi qo'ng'iroqlar bilan u erdan boshlanadi.
Nomlangan iterator
Yuqorida biz iteratorni yaratish uchun GetEnumerator usulidan foydalandik. Ammo hosil operatori har qanday usulda ishlatilishi mumkin, faqat shu usul IEnumerable interfeysi ob'ektini qaytarishi kerak. Bunday usullar nomlangan iteratorlar deb ham ataladi.
Keling, kompaniya sinfida shunday nomlangan iteratorni yarataylik va undan foydalanamiz:
__________________________________________________________________
class Person
{
public string Name { get; }
public Person(string name) =>Name = name;
}
class Company
{
Person[] personnel;
public Company(Person[] personnel) => this.personnel = personnel;
public int Length => personnel.Length;
public IEnumerable
GetPersonnel(int max)
{
for (int i = 0; i < max; i++)
{
if (i == personnel.Length)
{
yield break;
}
else
{
yield return personnel[i];
}
}
}
}
__________________________________________________________________
Bu erda aniqlangan iterator - IEnumerable Get Personal(int max) usuli parametr sifatida chiqadigan ob'ektlar sonini oladi. Dastur jarayonida uning qiymati personnel massivining uzunligidan kattaroq bo'lishi mumkin. Va xatolikka yo'l qo'ymaslik uchun yield break operatori ishlatiladi. Ushbu bayonot iteratorning bajarilishini to'xtatadi.



Download 63.55 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling