Г. Шилдт - С#4.0 Полное руководство (1160795), страница 127
Текст из файла (страница 127)
Такое продолжение осуп(ествляется с помощью оператора 1пго в комбинации с оператором яе1есг или згоир. Ниже приведена общая форма оператора 1пго: ьпго имн тело эапроса где имя обозначает конкретное имя переменной диапазона, используемой для циклического обращения к временному результату в продолжении запроса, на которое указывает тело запроса. Когда оператор 1пго используется вместе с оператором яе1есг или згопр, то его называют продолжением запроса, поскольку он продолжает . запрос.
По существу, продолжение запроса воплощает в себе принцип построения нового запроса по результатам предыдущего. ПРИМЕЧАНИЕ Существуег также форма оператора гпго, предназначенная для использования вместе с оператором э'о1п, создающим групповое объединение, о котором речь пойдет далее в этой главе. Ниже приведен пример программы, в которой оператор 1пго используется вместе с оператором дгоир. Эта программа является переработанным вариантом предыдущего примера, в котором список веб-сайтов формируется по имени домена самого верхнего уровня.
А в данном примере первоначальные результаты запроса сохраняются в переменной диапазона ыя и затем отбиракзтся для исключения всех групп, состоящих менее чем из трех элементов. 658 Часть (. Язык б№ // Использовать оператор гпго вместе с оператором отпор. оягпо Яуягеи( оядпц Яуягеы.Ь1пй) с1азя 1пгооеио ( ягасьс чогд Магп() ( ясг1по(] неЬядсея = ( "Ьянажеа.сои", "Ьянаиев.пег", "Ьянаиес.пес", "ЬянатеР.сои", "ЬянатеЕ.ого", "Ьянаиет.ого", ''Ьянамео.сч", "Ьянатен.пес", "Ьянаие1.сч" ): // Сформировать запрос на получение списка веб-сайтов, группируемых // по имени домена самого верхнего уровня, но выбрать только те // группы, которые состоят более чем из двух членов. // Здесь ня — зто переменная диапазона для ряда групп, // возвращаемях при выполнении первой половины запроса.
чаг неЬАддгя = 1гот аддг гп неЬягкея иЬеге аддг.саяс1пдехОЕ('.') != -1 отпор аддг Ьу аддг.зпЬяог1по(аддг.Ьаяо1пдехОГ('.')) гого уя нЬеге ня.Сопит() > 2 яе1есг ня( Выполнить запрос и вывести его результаты. Сопяо1е.игггеьгпе("Домены самого верхнего уровня "с более чем двумя членами.
1п") 1 гогеасЬ(чаг я1сея дп неЬаддгя) ( Сопяа1е.иггсеьгпе("Содержимое домена: " + я>сея.кеу)( Гогеасп(чаг я1Ге гп егозя) Сопяо1е.иг1сеьгпе(" " + я1се); Сопяо1е.Иггвевьпе(); ) ) Эта программа дает следующий результат: домены самого верхнего уровня с более чем двумя членами. Содержимое домена: .пес ЬянаиеВ.пес Ьянатес.пес ЬянаиеН.пес Как следует из результата выполнения приведенной выше программы, по запросу возвращается только группа . пев, поскольку это единственная группа, содержащая больше двух элемегпов.
Обратите особое внимание в данном примере программы на следующую последовательность операторов в формируемом запросе. дгоор аддг ьу аддг.япьягггпс(аддг.ьаяг1пдехое('.')) 1пго ня ИЬеге ня.Соппг() > 2 ве1есс ня; Глава 19. (1())Я 659 Сначала результаты выполнения оператора дгопр сохраняются как временные для последующей обработки оператором ыЬеге. В качестве переменной диапазона в данный момент служит переменная ыз.
Она охватывает все группы, возвращаемые оператором дгопр. Затем результаты запроса отбираются в операторе нпеге с таким расчетом, чтобы в конечном итоге остались только те группы, которые содержат больше двух членов. Для этой цели вызывается метод Соппп ( ), который является методом расширения и реализуется для всех объектов типа 1ВппвегаЬ1е. Он возвращает количество элементов в последовательности.
(Подробнее о методах расширения речь пойдет далее в этой главе.) А получающаяся в итоге пОследовательность групп возвращается оператором яе1есс. Применение оператора 1е~ дйя создания временной переменной в запросе Иногда возникает потребность временно сохранить некоторое значение в самом запросе. Донушим, чго требуется создать переменную перечислимого типа, которую можно будет затем запросить, или же сохранить некоторое значение, чтобы в дальнейшем использовать его в операторе ыпеге.
Независимо от преследуемой цели, эти виды функций могут быть осуществлены с помощью оператора 1е с. Ниже приведена общая форма оператора 1еьп 1ес гав = аьражение где имя обозначает идентификатор, получающий значение, которое дает выражение. Тип имени выводится из типа выражения. В приведенном ниже примере программы демонстрируется применение оператора 1ес для создания еще одного перечислимого источника данных. В качестве входных данных в запрос вводится массив символьных строк, которые затем преобразуются в массивы типа сЬаг. Для этой цели служит еще один метод обработки строк, называемый ТОСЬагйггау () и возвращающий массив, содержащий символы в строке. Полученный результат присваивается переменной ОЬгйггау, которая затем используется во вложенном операторе Гсов для извлечения отдельных символов из массива.
И наконец, полученные символы сортируются в запросе, и из них формируется результирующая последовательность. // Использовать оператор 1ег з месте с вложенным оператором Гсов. пя1пэ Яуягевг ияьпэ Буяяев.шпйг с1аяя Ьесбево ( ясапьс чоьс( Ма1п() ( ясг1пэ() ясгя = ( "а1рпа", "Ьепа", "давва" // Сформировать запрос на получение символов, возвращаемых из !/ строк з отсортированной последовательности. Обратите внимание на применение вложенного оператора гсов. чаг спгя = Егов япг 1п ясгя 1ес сьгасгау = ягг.тоепагяггау() 660 Часть!. Язык С(( Глот сЬ тп сЬтАггау отбегЬУ сп яе1ест сЬг сопяо1е.хт1теыпе("отдельные символы, отсортированные по порядку:") 1/ выполнить запрос и яызести его результаты. Гогеасп(спят с 1п сЬтя) Сопяо1е.иг1яе(с + " "); Сопяо1е.иг1теььпе()г ) ) Вот к какому результату приводит выполнение этой программы.
Отдельные символы, отсортированные по порядку: а а а а а Ь е Ч Ь 1 т ы р т Обратите внимание в данном примере программы на то, что в операторе 1ес переменной сЬгАтта у присваивается ссылка на массив, возвращаемый методом зсг. ТоСЬагАггау () . 1ет сптягтау = ятт.тоспагятгау() После оператора 1ет переменная СЬгАггау может использоваться в остальных операторах, составляющих запрос.
А поскольку все массивы в СФ преобразуются в тип 1ЕппыегаЬ1е<Т>, то переменную СЬгАгга у можно использовать в качестве источника данных для запроса во втором, вложенном операторе 1 топь Именно это и происходит в рассматриваемом здесь примере, где вложенный оператор Тгоы служит для перечисления в массиве отдельных символов, которые затем сортируются по нарастающей и возвращаются в виде конечного результата. Оператор 1ег может также использоваться для хранения неперечислимого значения. В качестве примера ниже приведен более эффективный вариант формирования запроса в программе 1пго()еыо из предыдущего раздела.
тат неЬАббгя = Ггоы аббг 1п иеЬя1тея 1ет 1бх = аббг.Ьаятгпбекст('.') нЬеге тбх (= -1 дтоср аббт Ьу аббг.випясггпдмбх) того ня нпете ня.Сопит() > 2 яе1ест няг В этом варианте индекс последнего вхождения символа точки в строку присваивается переменной 1бх. Данное значение затем используется в методе ЕпЬз Сгупгг () . Благодаря этому исключается необходимость дважды искать символ точки в строке. Объединение двух последовательностей с помощью оператора 1охтт Когда приходится иметь дело с базами данных, то зачастую требуется формировать последовательность, увязывающую данные из разных источников. Например, Глава 19. (.((с(() 661 в Интернет-магазине может быть организована одна база данных, связывающая наименование товара с его порядковым номером, и другая база данных, связывающая порядковый номер товара с состоянием его запасов на складе. В подобной ситуации может возникнуть потребность составить список, в котором состояние запасов товаров на складе отображается по их наименованию, а не порядковому номеру.
Для этой цели придется каким-то образом "увязать" данные из двух разных источников (баз данных). И это нетрудно сделать с помощью такого средства 1.1(с(Я, как оператор з о).и. Ниже приведена общая форма оператора > от и (совместно с оператором ггоы). ггои переменная диапазона А 1п источник данных А )оьп переменная диапазона В ьп источник данных В оп переменная диапазона А.свойство ечса1я переменная диапазона В.свойство Применяя оператор з овп, следует иметь в виду, что каждый источник должен содержать общие данные, которые можно сравнивать. Поэтому в приведенной выше форме этого оператора источник данных А и источник данных В должны иметь нечто общее, что подлежит сравнению.
Сравниваемые элементы данных указываются в части оп данного оператора. Поэтому если переменная диапазона А. снойстни и переменная диапазона А. свойство равны, то эти элементы данных "увязываются" успешно. По существу, оператор з овп выполняет роль своеобразного фильтра, отбирая только те элементы данных, которые имеют общее значение. Как правило, оператор з овп возвращает последовательность, состоящую из данных, полученных из двух источников. Следовательно, с помощью оператора з о1п можно сформировать новый список, состоящий из элементов, полученных из двух разных источников данных. Это дает возможность организовать данные по-новому. Ниже приведена программа, в которой создается класс 1сепь инкапсулирующий наименование товара и его порядковый номер.