// Iteratordan foydalanishning oddiy namunasi.
using System;
using System.Collections;
class MyClass {
char[] chrs = { 'A', 'B\ 'C, 'D' };
// Bu iterator chrs belgili massiv elementlarini qaytaradi.
public IEnumerator GetEnumerator() {
foreach(char ch in chrs)
yield return ch;
}
}
class ItrDemo {
static void Main() {
MyClass mc = new MyClass ();
foreach(char ch in mc)
Console.Write(ch + " ");
Console.WriteLine();
}
}
Ushbu dastur bajarilganda quyidagi natijalar olinadi.
А В С D
Ko'rib turganingizdek, mc.chrs massivning ro`yxati keltirilgan.
Keling, ushbu dasturni batafsil ko'rib chiqaylik. Birinchidan, MyClass sinfida IEnumerator amalga oshiriladigan interfeys sifatida ko'rsatilmagan. Iterator yaratilganda, kompilyator ushbu interfeysni avtomatik ravishda amalga oshiradi. Ikkinchidan, qulaylik uchun quyida keltirilgan GetEnumerator() metodiga alohida e'tibor beraylik.
// Bu iterator chrs massivi belgilarni qaytaradi.
public IEnumerator GetEnumerator() {
foreach(char ch in chrs)
yield return ch;
}
Bu sinf MyClass ob'ektlari uchun iterator. Ko'rib turganingizdek, IEnumerable interfeysida aniqlangan GetEnumerator() metodini aniq amalga oshiradi. Endi bu metodning tanasiga to'g'ridan-to'g'ri ko`rib chiqamiz. Unda chrs massivi elementlari bo'lgan foreach operatoridan iborat. Bu "yield return" operatori yordamida amalga oshiriladi. Bu operator kolleksiyaning keyingi ob'ektni qaytadi, bu holda u chrs massivining yana bir belgisi bo'ladi. Ushbu vosita yordamida MyClass tipidagi mc ob'ektiga murojaat qilish Main() metodi doirasida foreach siklida tashkil etiladi.
yield nomi C# tilida kontekstli kalit so'z sifatida xizmat qiladi. Bu shuni anglatadiki, u faqat iterator blokida maxsus maqsadga ega. Undan blokdan tashqarida har qanday boshqa identifikatorga o'xshash tarzda foydalanish mumkin.
Shuni alohida ta'kidlash kerakki, iterator boshqa turdagi qator yoki to'plamga tayanmasligi kerak. U faqat elementlarning to'plamidan keyingi elementni qaytarishi kerak. Bu shuni anglatadiki, elementlar tegishli algoritm bilan dinamik ravishda qurilishi mumkin. Misol tariqasida, quyida yuqoridagi dasturning versiyasi keltirilgan bo'lib, unda ingliz alifbosidagi barcha harflar katta registrda yozilgan. Qator o'rniga harflar for siklida hosil qilinadi.
// Iterator yordamida o'z navbatida qaytarilgan qiymatlarning
//dinamik qurilishiga misol.
using System;
using System.Collections;
class MyClass {
char ch = 'A';
// Ushbu iterator katta harflar bilan yozilgan
//ingliz alifbosidagi harflarni qaytaradi.
public IEnumerator GetEnumerator() {
for(int i=0; i < 26; i++)
yield return (char) (ch + i);
}
}
class ItrDemo2 {
static void Main() {
MyClass mc = new MyClassO;
foreach(char ch in mc)
Console.Write(ch + " ") ;
Console.WriteLine();
}
}
Bu dasturning natijasi quyidagicha.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Do'stlaringiz bilan baham: |