Главная » Просмотр файлов » 1629295403-b876e2087bddebea4bc9666fb2377a02

1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 94

Файл №846199 1629295403-b876e2087bddebea4bc9666fb2377a02 (С для чайников) 94 страница1629295403-b876e2087bddebea4bc9666fb2377a02 (846199) страница 942021-08-18СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 94)

Первое четное числоравно первому аргументу или, если он нечетен, на 1 меньше него. Последнее генерируе­мое четное число равно значению второго аргумента n S t o p (или, если n S t o p нечетно,на 1 больше него). Эта функция возвращает не значение типа i n t , а интерфейс I E n u ­m e r a b l e . Н о в ней все равно имеется инструкция y i e l d r e t u r n , которая возвращаетчетное число и затем ожидает очередного вызова из цикла f o r e a c h .Примечание:это еще один пример"коллекции",в основе которой нет никакой"настоящей" коллекции, наподобие уже рассматривавшегося ранее класса s t r i n g -цельные главыГлава 20.

Работа с коллекциями477C h u n k s . Заметим также, что эта коллекция вычисляется— на этот раз возвращаемыезначения не жестко закодированы, а вычисляются по мере необходимости. Это еще одинспособ получить коллекцию без коллекции. (Вы можете получать элементы коллекцииоткуда угодно — например, из базы данных или от Web-сервиса). И наконец, этот при­мер демонстрирует, что вы можете итерировать так, как вам заблагорассудится — на­пример с шагом -2, а не стандартным единичным.Вот как можно вызвать D e s c e n d i n g E v e n s () из цикла f o r e a c h в функцииM a i n () (заодно здесь показано, что произойдет, если передать нечетные граничназначения — еще одно применение оператора %):// Инстанцирование класса "коллекции" EvenNumbersEvenNumbers en = new E v e n N u m b e r s ( ) ;// И т е р и р о в а н и е : выводим четные ч и с л а от 10 до 4C o n s o l e .

W r i t e L i n e ( " \ п П о т о к убывающих ч е т н ы х ч и с е л : " ) ;f o r e a c h ( i n t even in en.DescendingEvens(11,3)){Console.WriteLine(even);}Этот вызов дает список четных чисел от 10 до 4. Обратите также внимание, как ис­пользуется цикл f o r e a c h .

Вы должны инстанцировать объект E v e n N u m b e r s (классколлекции). Затем в инструкции f o r e a c h вызывается метод именованного итератора:EvenNumbersforeach(inten = new E v e n N u m b e r s ( ) ;even in en.DescendingEvens(nTop,nStop))...Если бы D e s c e n d i n g E v e n s () был статической функцией, можно было быобойтись без экземпляра класса. В этом случае ее можно было бы вызватьс использованием имени класса, как обычно:foreach(int even(nTop,nStop))...inEvenNumbers.DescendingEvensПоток идей для потоков объектовТеперь, когда вы можете сгенерировать "поток" четных чисел таким образом, поду­майте о массе других полезных вещей, потоки которых вы можете получить с помощьюаналогичных "коллекций" специального назначения: потоки степеней двойки, членоварифметических или геометрических прогрессий, простых чисел или чисел Фибонач­чи — да что угодно.

Как вам идея потока случайных чисел (чем, собственно, и занимает­ся класс R a n d o m ) или сгенерированных случайным образом объектов?Если вы помните демонстрационную программу P r i o r i t y Q u e u e из гла­вы 15, "Обобщённое программирование", то можете взглянуть на другую де­монстрационную п р о г р а м м у — P a c k a g e F a c t o r y W i t h l t e r a t o r — наприлагаемом компакт-диске. В ней проиллюстрировано использование блокаитератора для создания потока сгенерированных случайным образом объек­тов, представляющих пакеты. Для этого применяется та же функция, чтои в классе P a c k a g e F a c t o r y в демонстрационной программе P r i o r i ­t y Q u e u e , но содержащая блок итератора.478Часть VII.

Дополнительные главы IГлИтерируемые свойстваМожно также реализовать блок итератора в виде свойства класса.— конкретнее,в функции доступа g e t ( )свойства. Вот простой класс с о свойством D o u b l e P r o p .Функция доступа g e t () этого класса работает как блок итератора, возвращающий потокзначений типа d o u b l e :// P r o p e r t y l t e r a t o r - д е м о н с т р и р у е т р е а л и з а ц и ю функции// доступа get свойства класса как блока итератораclassPropertylterator{doublet]doubles = {1.0,2.0,3.5,4.67};// D o u b l e P r o p - с в о й с т в о " g e t " с блоком и т е р а т о р аpublicSystem.Collections.IEnumerableDoublePropget{foreach(doubledbindoubles){}}yieldreturndb;}}Заголовок D o u b l e P r o p пишется так же, как и заголовок метода D e s c e n d ­i n g E v e n s ( ) в примере именованного итератора.

О н возвращает интерфейс I E n u ­m e r a b l e , но в виде свойства, не использует скобок после имени свойства и имееттолько функцию доступа g e t ( ) , н о н е s e t ( ) . Функция доступа g e t ( ) реализова­на как цикл f o r e a c h , который итерирует коллекцию и применяет стандартную ин­струкцию y i e l dr e t u r n для поочередного возврата элементов и з коллекции чи­сел типа d o u b l e .Вот как это свойство можно использовать в функции M a i n ( ) :// Инстанцируем класс "коллекции" P r o p e r t y l t e r a t o rP r o p e r t y l t e r a t o r p r o p = new P r o p e r t y l t e r a t o r ( ) ;// Итерируем е е :генерируем значения типа double поforeach(double db in prop.DoubleProp)одному{Console.WriteLine(db);Вы можете использовать обобщенные итераторы.Подробнее оних можноузнать из справочной системы, из раздела, п о с в я щ е н н о г о п р и м е н е н и ю ите­раторов.Где надо размещать итераторыВ н е б о л ь ш и х к л а с с а х и т е р а т о р о в с п е ц и а л ь н о г о н а з н а ч е н и я в д е м о н с т р а ц и о н н о й про­грамме I t e r a t o r B l o c k s к о л л е к ц и и р а з м е щ а л и с ь внутри класса итератора, к а к , на­пример, в M o n t h D a y s .

В н е к о т о р ы х с л у ч а я х э т о в п о л н е к о р р е к т н о , н а п р и м е р , к о г д аколлекция п о х о ж а н а к л а с с S e n t e n c e C h u n k s , в о з в р а щ а ю щ и й ч а с т и т е к с т а , и л и D e ­s c e n d i n g E v e n s , который возвращает вычисляемые значения. Но что, если вы хотитеГлава 20. Работа с коллекциями479п р е д о с т а в и т ь и т е р а т о р , о с н о в а н н ы й н а б л о к е и т е р а т о р а д л я р е а л ь н о г о к л а с с а коллекции,например такого, как L i n k e d L i s t ?Эта задача решается в демонстрационной программе L i n k e d L i s t W i t h l t e r a t o r B l o c k на п р и л а г а е м о м к о м п а к т - д и с к е . В н е й класс L i n k e d L i s t пе­р е п и с а н и и с п о л ь з у е т м е т о д G e t E n u m e r a t o r ( ) , р е а л и з о в а н н ы й как блокитератора.О н п о л н о с т ь ю з а м е н я е т с т а р ы й классLinkedListlterator.В п р и в е д е н н о м д а л е е л и с т и н г е п р е д с т а в л е н а т о л ь к о н о в а я в е р с и я GetEnu­m e r a t o r ( ) .

П о л н о с т ь ю д е м о н с т р а ц и о н н у ю п р о г р а м м у м о ж н о найти н а при­лагаемом компакт-диске.// L i n k e d L i s t W i t h l t e r a t o r B l o c k- реализует итератор для// связанного списка в виде блока итератораclass LinkedList//":I E n u m e r a t o r " больше не т р е б у е т с я{...Остальная//частьGetEnumeratorpublicкласса-реализованIEnumeratorкакблокитератораGetEnumerator(){//Проверяем//null,//установитьтак,//связанногоспискаондействительностьещеif(currentNodeне==текущегоиспользовался,чтобыонтакуказывалузла.чтонаЕслиегооннадоголовуnull){currentNode=head;}//Здесь//возвращаемоговыполняютсяитерацииметодомwhile(currentNode!=перечислителя,GetEnumerator()null){yield return currentNode.Data;currentNode = currentNode.forward;} }}Такой базовый вид блока итератора уже встречался ранее в этой главе:publicSystem.Collections.IEnumeratorGetEnumerator(){}Это выглядит точно так же, как и объект I E n u m e r a t o r , который метод G e t E n u ­m e r a t o r О возвращает в исходном классе 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 . Вы не пишете этот класс и не видите его код.О н н е является частью демонстрационной программы L i n k e d L i s t WithlteratorBlock.В методе G e t E n u m e r a t o r ()вы просто используете цикл для обходавсех узлов связанного списка и возврата с помощью y i e l d r e t u r n эле­ментов данных, хранящихся в каждом узле.

Этот код приведен в преды­дущем листинге.480Часть VII. Дополнительные главыВам больше не нужно определять ваш класс коллекции, как реализующий I E n u ­m e r a t o r , что видно из приведенного в листинге заголовка класса.Все не так простоПри этом нельзя забывать о некоторых неизбежных вещах.Вы должны убедиться, что начинаете обход с начала списка.Для этого в новый класс L i n k e d L i s t добавлен член-данные c u r r e n t N o d e , по­средством которого отслеживается перемещение итератора по списку.

Изначальночлен c u r r e n t N o d e равен n u l l , так что итератор должен проверять это условие.Если это так, он устанавливает c u r r e n t N o d e таким образом, чтобы тот указывална голову связанного списка.Если только h e a d н е равен n u l l (связанный список н е пуст), т о c u r r e n t N o d eстановится ненулевым до конца итераций. Когда же он достигает конца списка,итератор должен вернуть n u l l , что послужит сигналом о прекращении работыдля цикла f o r e a c h .При каждом шаге по списку необходимо осуществлять все действия, которые вы­полнялись ранее функцией M o v e N e x t () по перемещению к следующему узлу:// Действия, выполнявшиесяwhile(currentNode!= null){ранееMoveNextО// То, что делало с в о й с т в о C u r r e n ty i e l d r e t u r n c u r r e n t N o d e .

. . ; // ЧастьcurrentNode = currentNode.forward;кодаопущена}Большинство реализаций блоков итераторов используют цикл для прохода пок о л л е к ц и и — а иногда даже внутренний цикл f o r e a c h (но пример S t r i n g C h u n k s показывает, что это не единственно возможный путь).Когда вы проходите по списку и начинаете возврат данных с помощьюy i e l d r e t u r n , в ы должны "выковырять" хранящиеся данные и з объектаL L N o d e . Узел связанного списка — это всего лишь корзина для храненияs t r i n g , i n t , S t u d e n t и т.п.

объектов. Поэтому в ы должны вернуть н е c u r ­r e n t N o d e , а сделать следующее:y i e l d r e t u r n c u r r e n t N o d e . D a t a ; / / ВотcurrentNode = currentNode.forward;теперьверноTo же, но за сценой, делает и исходный перечислитель. Свойство D a t a классаL L N o d e возвращает данные в узле как O b j e c t . Исходный необобщенный свя­занный список преднамеренно спроектирован обобщенным настолько, насколькоэто возможно, поэтому он и хранит объекты класса O b j e c t .Теперь цикл w h i l e с инструкцией y i e l d b r e a k выполняет то, что ранее в ы должныбыли делать с огромным количеством работы. В результате метод G e t E n u m e r a t o r () ра­ботает в цикле f o r e a c h в функции M a i n ( ) , как и ранее.Если вы немного поразмышляете над этим, то поймете, что такая реализация просто пе­ремещает функциональность старого класса итератора L i n k e d L i s t l t e r a t o r в классLinkedList.Глава 20.

Характеристики

Тип файла
PDF-файл
Размер
14,75 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6418
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее