ся наведеної нижче процедури:
) Отримати нумератори, встановлюваний в початок колекції, викликавши для цієї колекції метод GetEnumerator (). [2]
) Організувати цикл, в якому викликається метод MoveNext (). Повторювати цикл до тих пір, поки метод MoveNext () повертає логічне знач?? ня true.
) Отримати в циклі кожен елемент колекції за допомогою властивості Current. [2]
Приклад використання перечіслітеля, запозичений з джерела [2] показаний в лістингу 8 (див. Додаток А).
Для циклічного звернення до елементів колекції цикл fоreach виявляється більш зручним, ніж Нумератор. Тим не менш, Нумератор надає більше можливостей для управління, оскільки його можна при бажанні завжди встановити у вихідне положення.
9.2 Застосування перечіслітеля типу IDictionaryEnumerator
Якщо для організації колекції у вигляді словника, наприклад типу Hashtable, реалізується неузагальнених інтерфейс IDictionary, то для циклічного звернення до елементів такої колекції слід використовувати Нумератор типу IDictionaryEnumerator замість перечіслітеля типу IEnumerator. Інтерфейс IDictionaryEnumerator успадковує від інтерфейсу IEnumerator і має три додаткових властивості. Першим з них є наведене нижче властивість. [3]
Entry {get;}
Властивість Entry дозволяє отримати пару ключ-значення з перечіслітеля у формі структури DictionaryEntry. Нагадаємо, що в структурі DictionaryEntry визначаються дві властивості, Key і Value, за допомогою яких можна отримувати доступ до ключа або значенням, пов'язаному з елементом колекції. Нижче наведено два інших властивості, що визначаються в інтерфейсі IDictionaryEnumerator
object Key {get; }
object Value {get; }
За допомогою цих властивостей здійснюється безпосередній доступ до ключа або значенням. [2]
Нумератор типу IDictionaryEnumerator використовується аналогічно звичайному перечіслітеля, за винятком того, що поточне значення в даному випадку виходить за допомогою властивостей Entry, Key або Value, а не властивості Current. Отже, придбавши Нумератор типу IDictionaryEnumerator, необхідно викликати метод MoveNext (), щоб отримати перший елемент колекції. А для отримання решти її елементів слід продовжити виклики методу MoveNext (). Цей метод повертає логічне значення false, коли в колекції більше немає жодного елемента. [2]
9.3 Реалізація інтерфейсів IEnumerable і IEnumerator
Для циклічного звернення до елементів колекції найчастіше простіше організувати цикл foreach, ніж користуватися безпосередньо методами інтерфейсу IEnumerator. Тим не менш, ясне уявлення про принцип дії подібних інтерфейсів важливо мати з ще однієї причини: якщо потрібно створити клас, що містить об'єкти, що перераховуються в циклі foreach, то в цьому класі слід реалізувати інтерфейси IEnumerator і IEnumerable.
Нижче представлений приклад реалізації інтерфейсу IEnumerator
bool MoveNext ()
{(index == ints.Length - 1)
{(); false;
} ++; true;
}
І приклад реалізації інтерфейсу Ienumerable
public IEnumerator GetEnumerator ()
{this;
}
Іншими словами, для того щоб звернутися до об'єкта визначається користувачем класу в циклі foreach, необхідно реалізувати інтерфейси IEnumerator і IEnumerable в їх узагальненої або неузагальнених формі.
10. Ітератори і оператор yield
Ітератор являє собою метод, в якому використовується ключове слово yield для перебору по колекції або масиву. [3]
Найбільш простий спосіб створення ітератора полягає в реалізації методу GetEnumerator для інтерфейсу IEnumerable, наприклад:
System.Collections.IEnumerator GetEnumerator ()
{(int i=0; i lt; 10; i ++)
{return i;
}
}
Наявність методу GetEnumerator створює тип перераховується типу і дозволяє використовувати оператор foreach statement. Якби Наведений вище метод був частиною визначення класу для ListClass, то можна було б використовувати foreach для класу наступним чином [5]
static void Main ()
{listClass1=new ListClass ();
(int i in listClass1)
{. Console.WriteLine (i);
}
}...