Г. Шилдт - С#4.0 Полное руководство (1160795), страница 126
Текст из файла (страница 126)
яе1есс пен Ета11Аббгеяя (епсгу.нате, епсгу.Еша11) ! В этом операторе создается новый объект типа Ета11Ас(с(ге я я, содержащий имя и адрес электронной почты, получаемые из объекта типа СопбасС1пуо, хранящегося в массиве сопбасСЯ. Но самое главное, что новые объекты типа Еша11Ас(с(геяя создаются в операторе яе1есС во время выполнения запроса. Применение вложенных операторов йгоа Запрос может состоять из нескольких операторов.Тгот, которые оказываются в этом случае вложенными. Такие операторы Тгош находят применение в тех случаях, когда по запросу требуется получить данные из двух разных источников.
Рассмотрим простой пример, в котором два вложенных оператора Тгош используются в запросе для циклического обращения к элементам двух разных массивов символов. В итоге по такому запросу формируется последовательность результатов, содержащая все возможные комбинации двух наборов символов. // Использовать два вложенных оператора Тгош длл составления списка // всех возможных сочетаний букв А, В и С с буквами Х, У и Е. ояьпч Яуясеш; оягпд Яуяоеш/ьгпьн О Этот класс содержит результат запроса. с1аяя Свгра1г ( роЬ11с сьаг 51гяс; 664 Часть 1. Язык С№ рцЫгс спаг Зесопси рцЫгс Спгра1г(сваг с, сваг с2) Рьгяс = с; Зесопг) = с2; ) ) с1аяя Мп1сгр1еггощя ( ягаггс чо1о нагп () ( сваг[) скгя = ( 'А', "В', 'С' ); с)1аг[) с)1гя2 = ( 'Х', 'У', 'Е' ); О В первом операторе Ггощ организуется циклическое обращение // к массиву символов сьгя, а во втором операторе Ггощ— О циклическое обращение к массиву символов сьгя2.
чаг равгя = Ггот сЫ гп сьгя Ггощ сь2 гп сьгя2 яе1есс пен Сьгра1Г(СЫ, со2); Сопяо1е.кггсегйпе("Все сочетания букв АВС и ХУЕ: Госева(чаг р гп раггя) Сопво1е.иг1Гепапе("(0) (1)", р.гзгяс, р.зесопб); Выполнение этого кода приводит к следующему результату. Все сочетания букв АВС и ХЕЕ: А Х А т А Е В Х В т В Е С Х С т С Е Этот пример кода начинается с создания класса с)тгразг, в котором содержатся результаты запроса.
Затем в нем создаются два массива, спгя и с)тгя2, и, наконец, формируется следующий запрос для получения всех возможных комбинаций двух последовательностей результатов. чаг раггя = Ггощ сЫ 1п слгя Ггощ сь2 гп сьгя2 яе1ест пен СьгРа1г(сЫ, сп2); Во вложенных операторах Ргощ организуется циклическое обращение к обоим массивам символов, с)тгя и с)тгя2.
Сначала из массива спгя получается символ, сохраняемый в переменной с)т1. Затем перечисляется содержимое массива с)тгя2. На каждом шаге циклического обращения во внутреннем операторе Ргощ символ из массива спгя2 сохраняется в переменной с)т2 и далее выполняется оператор яе1есг. В результате выполнения оператора яе1есг создается новый объект типа С)згра1г, Глава 19. Ийе 655 содержащий пару символов, которые сохраняются в переменных СЬ1 и СЬ2 на каждом шаге циклического обращения к массиву во внутреннем операторе 1 лов. А в конечном итоге получается объект типа СЬгра1г, содержащий все возможные сочетания извлекаемых символов.
Вложенные операторы Тгов применяются также для циклического обращения к источнику данных, который содержится в другом источнике данных. Соответствующий пример приведен в разделе "Применение оператора 1ег для создания временной переменной в запросе" далее в этой главе. Группироваиие результатов с помощью оператора дгоир Одним из самых эффективных средств формирования запроса является оператор дгоир, поскольку он позволяет группировать полученные результаты по ключам.
Используя последовательность сгруппированных результатов, можно без особого труда получить доступ ко всем данным, связанным с ключом. Благодаря этому свойству оператора дгоир доступ к данным, организованным в последовательности связанных элементов, осуществляется просто и эффективно. Оператор дгоир является одним из двух операторов, которыми может оканчиваться запрос.
(Вторым оператором, завершающим запрос, является яе1есс.) Ниже приведена общая форма оператора дгоир. дгоир переменная диапазона Ьу нлвч Этот оператор возвращает данные, сгруппированные в последовательности, причем камсдую последовательность обозначает общий ключ. Результатом выполнения оператора дгоир является последовательность, состоящая из элементов типа 1Егоир1пд<ТКеу, ТЕ1евепс>, т.е. обобщенного интерфейса, объявляемого в пространстве имен Еуягев. 11пд.
В этом интерфейсе определена коллекция объектов с общим ключом. Типом переменной запроса, возвращающего группу,является 1ЕпивегаЬ1е<16гоиргпд<ТКеу, ТЕ1евепс».Винтерфейсе 16гоир1пд определено также доступное только для чтения свойство Кеу, возвращающее ключ, связанный с каждой коллекцией. Ниже приведен пример, демонстрирующий применение оператора дгоир. В коде этого примера сначала объявляется массив, содержащий список веб-сайтов, а затем формируется запрос, в котором этот список группируется по имени домена самого верхнего уровня, например .
огд или . Сов. // Продемонстрировать применение оператора дгоир. иягпд Вуяоев; иягпд Вуясевддпси о1аяя Вгоироево ясного чоха Маго() ( яоггпд() неЬяггея = ( "Ьявавек.сов", ТпявавеВ.пес", ТояввлеС.пес", "ЬяиавеР.сов", "ЬявавеЕ.огд", "Ьяиавег.огд", явявавеб.оч", "Ьявавен.пес", "Ьянаве1.оч" !/ Сформировать запрос на получение списка веб-саитов, // группируеммх по имени домена самого верхнего уровня.
656 Часть 1. Язык С№ чаг иеЬАббгя = Ггсв аббг Ьп иеЬяггея ипеге аббг.ьаяс1пбехос('.') (= -1 дгспр аббг Ьу аббг.зпьяхг1пд(аббг.ьаяс1пбехог('.')); Выполнить запрос и вывести его результаты. гсгеасЬ(чаг я1хея 1п иеЬАббгя) ( Сопяс1е.иггхеьгпе("Веб-сайты, сгруппированные " + "пс имени домена" ь аггея.кеу)," Гсгеасп(чаг я1хе 1п яххея) Сспяс1е.Хггхеьгпе(" " + ягхе); Сспяс1е.игьхеЬЬпе(); ) Вот к какому результату приводит выполнение этого кода. Веб-сайты, сгруппированные пс имени домена .сов ЬянавеА.сов Ьянявео.сов Веб-сайты, сгруппированные пс имени домена .пех ЬянавеВ.пех Ьянавес.пех Ьянавен.пег Веб-сайты, сгруппированные по имени домена .сгд ЬянавеЕ.Огд Ьянавер.сгд Веб-сайты, сгруппированные пс имени домена .хч Ьянавео.хч Ьянаве1.хч Как следует из приведенного выше результата, данные, получаемые по запросу, группируются по имени домена самого верхнего уровня в адресе веб-сайта.
Обратите внимание на то, как это делается в операторе дхопр из следующего запроса. чаг иеЬАддгя = Ггсв аддг Ьп иеЬягхея иЬеге аббг.ьаях1пбехос('.') )= -1 дгспр аббг Ьу аббг.зпьягггпд(аббг.ьаяг1пбехог('.'))т Ключ в этом операторе создается с помощью методов Ьаях1пбехОг () и Впьясх хпд (), определенных для данных типа я с гбпд. (Эти методы упоминаются в главе 7, посвященной массивам и строкам. Вариант метода ВпЬясхзпд (), используемый в данном примере, возвращает подстроку, начинающуюся с места, обозначаемого индексом, и продолжающуюся до конца вызывающей строки.) Индекс последней точки в адресе веб-сайта определяется с помощью метода Ьаяхтпбехо1 () . По этому индексу в методе ВпЬя хххпд ( ) создается оставшаяся часть строки, в которой содержится имя домена самого верхнего уровня.
Обратите внимание на то, что в операторе иЬехе отсеиваются все строки, которые не содержат точку. Метод Ьаяс1пбехОГ () возвращает -1, если указанная подстрока не содержится в вызывающей строке. Глава 19. ОНО 657 Последовательность результатов, получаемых при выполнении запроса, хранящегося в переменной ыеЬдс(бгя, представляет собой список групп, поэтому для доступа к каждому члену группы требуются два цикла гогеас(г. Доступ к каждой группе осуществляется во внешнем цикле, а члены внутри группы перечисляются во внутреннем цикле. Переменная шага внешнего цикла гогеас(г должна быть экземпляром интерфейса 16гоир1пг1, совместимым с ключом и типом элемента данных.
В рассматриваемом здесь примере ключи и элементы данных относятся к типу яг г1пп. Поэтому переменная ягсея шага внешнего цикла имеет тип 16гопр1пд<ясг1пд, ясг1по>, а переменная я гсе шага внутреннего цикла — тип ясг1пд. Ради краткости данного примера обе переменные объявляются неявно, хотя их можно объявить и явным образом, как показано ниже. гогеась(16гоир1пд<ясг1пд, ясг1по> ягсея 1п неьдг(пгя( ( Сопяо1е.нг1сеъгпе("Веб-сайты, сгруппированные "по имени домена" + аггея.кеу)г гогеась(яггьпд ягге ьп язгея) Сопяо1е.нггсеъьпе(" " + я1Ге(( Спп*п1е.нггьеъьпе(); Продолжение запроса с помощью оператора ~про При использовании в запросе оператора яе1есс или дгопр иногда требуется сформировать временный результат, который будет служить продолжением запроса для получения окончательного результата.