
C# для чайников
.pdf

I E n u m e r a t o r предоставляет три следующих метода.
R e s e t () — устанавливает итератор таким образом, чтобы он указывал на начало коллекции. Примечание: обобщенная версия I E n u m e r a t o r , I E n u m e r a t o r < T > , не предоставляет метод R e s e t ( ) . В случае обобщенного L i n k e d L i s t просто начинайте работу с вызова M o v e N e x t ( ) .
M o v e N e x t () — перемещает итератор от текущего объекта в контейнере к сле дующему.
C u r r e n t — свойство (не метод), которое дает объект данных, хранящийся в те кущей позиции итератора.
Описанный принцип продемонстрирован приведенной далее функцией. Про граммист класса M y C o l l e c t i o n (не показанного здесь) создает соответствующий класс итератора — скажем, I t e r a t o r M y C o n t a i n e r (применяя соглашение об именах I t e r a t o r X , упоминавшееся ранее). Прикладной программист ранее сохра нил ряд объектов C o n t a i n e d D a t a O b j e c t s в коллекции M y C o l l e c t i o n . Приве денный далее фрагмент исходного текста использует три стандартных метода I E n u m e r a t o r для чтения этих объектов:
/ / К л а с с M y C o l l e c t i o n х р а н и т о б ъ е к т ы т и п а |
|
|
||||||||
/ / C o n t a i n e d D a t a O b j e c t |
d a t a |
|
|
|
|
|
|
|||
void |
M y F u n c t i o n ( M y C o l l e c t i o n |
m y C o l l ) |
|
|
|
|||||
{ |
|
|
|
|
|
|
|
|
|
|
/ / П р о г р а м м и с т , |
с о з д а в ш и й к л а с с M y C o l l e c t i o n , |
с о з д а л т а к ж е |
||||||||
/ / и к л а с с и т е р а т о р а |
I t e r a t o r M y C o l l e c t i o n ; |
п р и к л а д н о й |
||||||||
/ / п р о г р а м м и с т |
с о з д а е т о б ъ е к т и т е р а т о р а д л я п р о х о д а п о |
|||||||||
/ / |
о б ъ е к т у m y C o l l |
|
|
|
|
|
|
|
|
|
I E n u m e r a t o r i t e r a t o r |
= |
n e w |
I t e r a t o r M y C o l l e c t i o n ( m y C o l l ) ; |
|||||||
/ / п е р е м е щ а е м и т е р а т о р в |
" с л е д у ю щ у ю п о з и ц и ю " в н у т р и |
|||||||||
/ / к о л л е к ц и и |
|
|
|
|
|
|
|
|
|
|
w h i l e ( i t e r a t o r . M o v e N e x t ( ) ) |
|
|
|
|
|
|
||||
{ |
|
|
|
|
|
|
|
|
|
|
|
/ / П о л у ч а е м с с ы л к у н а о б ъ е к т д а н н ы х в т е к у щ е й п о з и ц и и |
|||||||||
|
/ / к о л л е к ц и и |
|
|
|
|
|
|
|
|
|
|
C o n t a i n e d D a t a O b j e c t |
c o n t a i n e d D a t a ; |
/ / d a t a |
|
||||||
|
c o n t a i n e d = |
( C o n t a i n e d D a t a O b j e c t ) i t e r a t o r . C u r r e n t ; |
||||||||
|
/ / . . . и с п о л ь з у е м о б ъ е к т |
д а н н ы х |
c o n t a i n e d . . . |
|
||||||
Функция M y F u n c t i o n () |
принимает |
в |
качестве аргумента |
коллекцию C o n |
||||||
t a i n e d D a t a O b j e c t s . Она |
начинается с |
создания |
итератора |
типа I t e r a t o r M y |
C o l l e c t i o n . Функция начинает цикл с вызова M o v e N e x t ( ) . При первом вызове MoveNext () перемещает итератор к первому элементу коллекции. При каждом по следующем вызове M o v e N e x t () перемещает указатель "на одну позицию." Функ ция M o v e N e x t () возвращает f a l s e , когда коллекция исчерпана и итератор боль ше нельзя передвинуть.
Свойство C u r r e n t возвращает ссылку на объект данных в текущей позиции итера тора. Программа преобразует возвращаемый объект в C o n t a i n e d D a t a O b j e c t перед тем, как присвоить его переменной c o n t a i n e d . Вызов C u r r e n t некорректен, если предшествующий вызов метода M o v e N e x t () не вернул t r u e .
Глава 20. Работа с коллекциями |
463 |




Вывод программы прост и элегантен: |
|
|
|
|
|
|||||
Ищем в о з р а с т |
L i s a |
|
|
|
|
|
|
|
||
Возраст |
L i s a |
- |
10 |
|
|
|
|
|
|
|
Нажмите |
< E n t e r > |
д л я |
з а в е р ш е н и я п р о г р а м м ы . . . |
|
|
|
||||
В |
качестве |
о т с т у п л е н и я — |
интерфейс |
I L i s t описывает |
класс, |
предостав |
||||
л я ю щ и й целый |
индексатор |
в |
ф о р м е |
o b j e c t t h i s [ i n t ] . В |
С # |
имеется |
||||
также интерфейс |
I L i s t < T > , |
который |
позволяет заменить |
o b j e c t |
выбран |
н ы м вами т и п о м Т . Это устраняет необходимость преобразования типов из предыдущего примера .
Помните код функции M a i n ( ) , написанный при демонстрации самостоятельно раз работанного класса L i n k e d L i s t ? (Его можно найти в демонстрационной программе L i n k e d L i s t C o n t a i n e r на прилагаемом компакт-диске.) Вот его фрагмент:
p u b l i c s t a t i c v o i d M a i n ( s t r i n g [ ] a r g s )
{
/ / С о з д а е м к о н т е й н е р и д о б а в л я е м в н е г о т р и э л е м е н т а L i n k e d L i s t 1 1 с = n e w L i n k e d L i s t ( ) ;
/ / Д о б а в л я е м о б ъ е к т ы . . .
C o n s o l e . W r i t e L i n e ( " П р о х о д п о к о н т е й н е р у в р у ч н у ю " ) ; L i n k e d L i s t l t e r a t o r H i
=( L i n k e d L i s t l t e r a t o r ) 1 1 с . G e t E n u m e r a t o r ( ) ;
H i . R e s e t ( ) ;
w h i l e ( H i . M o v e N e x t ( ) )
{
s t r i n g s = ( s t r i n g ) H i . C u r r e n t ; C o n s o l e . W r i t e L i n e ( s ) ;
}
Данный код получает L i n k e d L i s t l t e r a t o r и использует его метод M o v e N e x t () и свойство C u r r e n t для обхода связанного списка. Однако С# 2.0 может упростить вам этот обход так, что вы получите перечисленные преимущества.
Вам не придется вызывать G e t E n u m e r a t o r () (и выполнять преобразование ти па результатов).
Вам не понадобится вызывать M o v e N e x t ( ) .
Вам не придется вызывать C u r r e n t и выполнять преобразование типа, возвра щаемого значения.
Вы сможете просто использовать f o r e a c h для обхода коллекции (С# сделает все остальное за вас).
Если быть честным, то f o r e a c h работает и для класса L i n k e d L i s t из этой гла вы. Это связано с наличием метода G e t E n u m e r a t o r ( ) . Но я все еще должен са мостоятельно писать класс L i n k e d L i s t l t e r a t o r . Новизна состоит в том, что вы можете пропустить при обходе часть вашего класса.
Глава 20. Работа с коллекциями |
469 |
