Добавил:
2200 7008 9480 6099 TKFF БЛАГОДАРНОСТЬ МОЖНО ТУТ ОСТАВИТЬ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДИПЛОМ 2025 / 4 курса_МТУСИ / 1 КУРС / Информатика / С# для чайников - Мюллер.pdf
Скачиваний:
0
Добавлен:
04.06.2025
Размер:
53.3 Mб
Скачать

Сначала программа создает объект ma типа KeyedArray длиной 1 00 (т.е. со ста свободными элементами). Далее в этом объекте сохраняется возраст детей семьи Симпсонов с использованием имен в качестве индексов. И наконец про­ грамма получает возраст Лизы с применением выражения ma [ "Lisa" J и выво­ дит его на экран.

Обратите внимание на то, что программа должна выполнить преобразова­ ние типа для значения, возвращенного из ma [ J , так как KeyedArray написан та­ ким образом, что может хранить объекты любого типа. Без такого преобразова­ ния типов можно обойтись, если индексатор написан так, что может работать только со значениями типа int, или если KeyedArray - обобщенный класс (см. главу 8, "Обобщенность"). Вывод программы прост и элегантен:

Ищем возраст Lisa Возраст Lisa - 10

Нажмите <Enter> дпя завершения программы. . .

Блок итератора

В предыдущих версиях С# связанный список, обсуждавшийся в разделе "Обращение к коллекциям как к массивам : индексаторы" этой главы, был ос­ новным способом обхода коллекции, так же как в С++ и С. Хотя это решение вполне работоспособно, оказывается, что начиная с С# версии 2.0 этот процесс упрощен таким образом, что вам не нужно вызывать:

))

GetEnumerator ( ) (и выполнять преобразование типа результатов);

)) MoveNext ( ) ;

))

Current (и выполнять преобразование типа возвращаемого значе­

 

ния);

))

Вы можете просто использовать foreach для обхода коллекции

 

(С# сделает все остальное вместо вас).

Честно говоря, foreach работает и для класса LinkedList из .NET. Это связано с наличием метода GetEnumerator ( ) . Но я все еще дол­ жен самостоятельно писать класс LinkedLi stiterator. Новизна

состоит в том, что вы можете пропустить при обходе часть своего класса.

Вместо реализации всех этих методов интерфейсов в создаваемых вами классах коллекций можно использовать ­: лr2 2eи4)e iл, (iterator Ыосk) и обойтись без написания отдельного класса итератора для поддержки коллек­ ций. Можно использовать блок итератора и для других рутинных работ.

ГЛАВА 7 Работа с коллекциями 187

Создание каркаса блока итератора

Наилучший способ реализовать итерирование - использовать бло­ ки итераторов. Когда вы пишете класс коллекции, такой как tоуоаQеуаили 1веовеау1моЬоПвместо интерфейса 6Лл овнаоввы реализуете блок итератора. Затем пользователи этого класса могут просто итерировать коллекцию с помо­ щью цикла оовоннЬиВот как выглядит базовый каркас, содержащий функции, используемые в следующих разделах.

 

4

 

 

 

 

U

 

 

 

к

 

 

 

 

 

у

 

 

к а

 

 

кт

н

Г

к

 

 

К

к

к

 

 

к

 

 

 

5

у

 

кр

т

Ж

к

 

а

Г

к

а

 

кр

р з

Г

к

 

 

Ч

к

 

Ж

к

 

 

 

к з

 

 

кр

у

Д

ан

к

 

 

Д

к

а

188 ЧАСТЬ 1 Основы программирования на С#

Показанный здесь метод Main ( ) обеспечивает основные функции тестиро­

ван ия блока кода итератора. Каждый из приведенных фрагментов кода демон­ стрирует, как код метода Main ( ) взаимодействует с блоком итератора. Пока что достаточно просто знать, что метод Main ( ) - это одна функция, и в следую­

щих разделах мы разделим ее на части, чтобы ее было проще понять.

Итерирование дней в месяцах

Приведенны й далее класс предоставляет итератор (показан полужирным

шрифтом), который проходит по месяцам года.

"" "рим

3"щ ­

 

 

 

 

 

l

""

"рим

3"щ

 

 

 

 

 

 

(rщ

 

 

 

 

 

 

х: им1l О грим

3

т : ,'х щх и : т l

т"щх(3

Pгот l

т Тщим

щхP О т l

тrтх:z P r т l т

P р т l т Т им,P r т ( тТ ­ P : т (

тr

1

P: т l т 6,т , г ,х P r т l т,(

р',х P E т l

т) р ,г

,хP r т l

т ",(,г ,х

P : т

V

 

 

""C,

 

,им

гхщ,

рх­

 

 

 

 

ыhs

акж пчионы ь мнллнкоан ви атnвrнтронтж

6оnвhынтро нт ипж

интнркаж

ииотавтж ынвоаж авжынвоаипж

 

ттжщсщбс,Tж

 

цсж сT с5ж

) лддцж

бжюп с,ж б лс ,ж

 

чан.ож

тнонзж

ынвоа ржттж­ сбЬж тумюрдж

koздз, З, "рьежр,е, хеВВкхК сотс,

.,ы,

=

==

(+ =*(5+(= ;e(55 ;(e=(;i))

(5)(-())n=

 

)( -(55)-(t ;(; ) ;=(55

S S

 

l e(55(=(*=)+ -(55)- m=(-()+n

+(*(a( )-(=+ +)=

r

n

(a=(;e)()+

)+(*)*=(+ =())==

;(ee(;i)=

(( ==(; )+(*(+(*(

-n=((+(-= m+)

5+*(;) =( (=)(= n

(==(=5+*(;( 5(=(*=)+ )-= -(5=i(5;(e )E(5+-(- =)(= -

)(-

=(5=)(+ ))E(a(

5e(=)(a(

 

 

 

 

- =())(-

5e=E((;(;

-(+(=

=(55(=*(=(e=(+5(=5+-())n= ==(; )+(*(+(*(

Sr

S

lr

(+(=n

Sr

S

lr

-(=-*(l((+ (=

(;++)=(

rS

 

Sпr

S

lr

( -n=(e=)n =ne) 5(==(-(+=+(;(= -(+(= ) *(

=(o

)(( )(

-n =(e=)n =ne) =)5(+=)(

+(e=;( (a(

)(

) 5(=5+-())n= ;e(55

*(E)5e)+(===e==( (*==) -(i(a(

;=(55(

;(=e(;i))n (=(*==( -n=)i(+(

 

+(==;( =*(5+(=-(+(=t-(=-*(l(=l)= =(*(E)5e)+(e=5)5=(e==(-())(- )(-nu

;e=E(-nu5e(-

S

Sr

 

5((5+(e=)((

t

=(e((+--(5+( -(5 5(==((+=(

=(-n=;e(55

=(*(E)5e)+(e =*)-()=(+ (a( -(+(=

S

S=e=)+(*)*(r

-(

 

))=

-(5=-()=i(=+5=;(e)E(5+-( *(=(+n ) *(=-(*)5u(=)(a(

+(;5+(

 

 

 

 

(i ;e(55 5(=(*=(l)= -(+(= Sr

S

lr

=(e=i( )(

=(e=()

 

*((e)=(-n-(+=))+(*m(=5

S

lr

5e(===l)u *(==(e(u-(-

пt

( ===(+=(;(=()(

)(5

e=;( -(*)(i)=

==(;(- )+(*

(*(-

 

 

 

»обычные итераторы;

»именованные итераторы;

)> свойства классов, реализованные как итераторы.

юдаоненотиеаоиеоионеrунеаонер?ь.ж­ ьпt.lп2 SнкоттоСl­.x tпкте роабенoенюVlпьtоненеаxo rыаоденоонтетнаеноаететипнаоииоааоттетоо hюененоаонеаетуотнеетиеюылпянoенкнеиеекееиеиетерононr тr птерен нот иаеаоаоaиебот роииеыиюотоо.оннеуотнет тоeоанероеаоонтдтипн наоииеыoенюVlпьtоненеаx rыиоаороонвюоаоинловюоаоинеат рапиеыoеню 2lпьtолоx иаороюоае?ь. ж­ ьпt.lп S о

nке

ЧАСТЬ 1 тйеот нижаощаыяява отыевNизЬ С#

Соседние файлы в папке Информатика