Это исключительно простой "класс коллекции", основанный на массиве, как и клак K e y e d A r r a y . Класс содержит массив, элементы которого имеют тип s t r i n g . Ков клиент итерирует данную коллекцию, ее блок итератора выдает ему эти строки по одной Каждая строка содержит имя месяца с количеством дней в нем. Тут нет ничего сложной, Класс определяет собственный блок итератора, в данном случае как метод GetEnumera t o r ( ) . Метод G e t E n u m e r a t o r ( ) возвращает объект типа S y s t e m . C o l l e c t i o n s ,
I E n u m e r a t o r . Да, вы должны были писать такой метод и ранее, но вы должны были писать не только его, но и собственный класс-перечислитель для поддержки вашего класса-коллекции. Теперь же вы пишете только простой метод, возвращающий пере. числитель с использованием новых ключевых слов y i e l d r e t u r n . Все остальное C# делает за вас: создает класс-перечислитель и применяет его метод M o v e N e x t () для итерирования. У вас уменьшается количество работы и размер исходного текста.
Ваш класс, содержащий метод G e t E n u m e r a t o r ( ) , больше не должен реализовы вать интерфейс I E n u m e r a t o r . В следующих разделах вам будет показано несколько вариаций блоков итераторов:
обычные итераторы; именованные итераторы;
свойства классов, реализованные как итераторы.
Что такое коллекция
Остановимся на минутку и сравним эту небольшую коллекцию с коллекцией L i n k e d L i s t , рассматривавшейся ранее в главе. В то время как L i n k e d L i s t имеет сложную структуру узлов, связанных посредством указателей, приведенная простейшая коллекция месяцев основана на простом массиве с фиксированным содержимым. Но все же следует расширить понятие коллекции.
(Ваш класс коллекции не обязан иметь фиксированное содержимое — большинство коллекций разработаны для хранения объектов путем добавления их в коллекции, на пример, с помощью метода A d d () или чего-то в этом роде. Класс K e y e d A r r a y , к при меру, использует для добавления элементов в коллекцию индексатор. Ваша коллекция также должна обеспечивать метод A d d ( ) , как и блок итератора, чтобы вы могли рабо тать с ней с помощью f o r e a c h . )
Цель коллекции, в наиболее общем смысле, заключается в хранении множества объ ектов и обеспечении возможности их обхода, последовательно выбирая их по одномухотя иногда может использоваться и произвольная выборка, как в демонстрационной программе I n d e x e r . (Конечно, массив и так в состоянии справиться с этим, без допол нительных "наворотов" наподобие класса M o n t h D a y s , но итераторы вполне могут при меняться и за пределами примера M o n t h D a y s . )
Говоря более обобщенно, независимо от того, что именно происходит за сценой, ите рируемая коллекция генерирует "поток" значений, который можно получить с помощью f o r e a c h .
Для лучшего понимания данной концепции ознакомьтесь с еще одним примером про стого класса из демонстрационной программы I t e r a t o r B l o c k s , который иллюстри рует чистую идею коллекции:
/ / S t r i n g C h u n k s - о п р е д е л е н и е и т е р а т о р а , в о з в р а щ а ю щ е г о / / ф р а г м е н т ы т е к с т а