Г. Шилдт - С#4.0 Полное руководство (1160795), страница 125
Текст из файла (страница 125)
АссоцпснолЬег, асс.Ва1апсе); ) Сопяо1е.нг1себгпе(); ) Ниже приведен результат выполнения этой программы. Счета в отсортированном порядке: $10.98 Номер счета: 108СК, Джонс, Дженни Номер счета: 434СК, Номер счета: 454ММ, Номер счета: 436СО, Джонс, Ральф Джонс, Ральф Джонс, Ральф (6123.32) 6987.13 $1,923.85 Номер счета: 968ММ, $5,146.67 Номер счета: 897СО, 63,223.19 Номер счета: 445СК, (8213.67) Краммер, Бетти краммер, тел Смит, Альберт Сформировать запрос на получение сведений о // банковских счетах в отсортированном порядке.
// Отсортировать зти сведения сначала по имени, затем // по фамилии и, наконец, по остатку на счете. чаг асстпбо = ггои асс уп ассоцпгя огбегЬу асс.Ьаягнаве, асс.гггяснате, асс.Ва1апсе яе1есс асс; сопяо1е.игггеьгпе("счета в отсортированном порядке: "); Глава 19. Ойц 649 Смит, Карл Номер счета: 078СО, $15,345.99 Номер счета: 843СК, $345.00 Номер счета: 543НН, $5, 017.40 Номер счета: 547СО, $34, 955.79 Смит, Сара Смит, Сара Смит, Сара Номер счета: 132СК, $100.23 Номер счета: 132СО, $10,000.00 Смит, Том Смит, Том чаг асстлго = Гсов асс 1л ассослгя огдегЬу асс.ьаягнаве, асс.г1гягнаве, асс.Ва1алсе яе1есг асс; Сортировка результатов этого запроса осуществляется следующим образом.
Сначала результаты сортируются по фамилии, затем элементы с одинаковыми фамилиями сортируются по имени. И наконец, группы элементов с одинаковыми фамилиями и именами сортируются по остатку на счете. Именно поэтому список счетов вкладчиков по фамилии Джонс выглядит так. Джонс, Дженни Номер счета: 108СК, $10.98 Номер счета: 434СК, )$123.32) Номер счета: 454НН, $987.13 Номер счета: 438СО, $1, 923.85 Джонс, Ральф Джонс, Ральф Джонс, Ральф Как показывает результат выполнения данного запроса, список счетов отсортирован сначала по фамилии, затем по имени и, наконец, по остатку на счете. Используя несколько критериев, можно изменить на обратный порядок любой сортировки с помощью ключевого слова деяселд1лд.
Например, результаты следующего запроса будут выведены по убывающей остатков на счетах. чаг асс1лто = Гсов асс 1л ассоолгя огдегьу х.ьаяснаве, х.гвгяснаве, х.Ва1алсе деяселд1лч яе1есс асс; В этом случае список счетов вкладчиков по фамилии Джонс будет выглядеть так, как показано ниже. Джонс, Дженни Номер счета: 108СК, $10.98 Номер счета: 438СО, $1,923.85 Номер счесав: 454НМ, $987.13 Номер счета: 434СК, ($123.32) Джонс, Ральф Джонс, Ральф Джонс, Ральф Как видите, теперь счета вкладчика по фамилии Ральф Джонс выводятся по убывающей: от наибольшей до наименьшей суммы остатка на счете. Подробное рассмотрение оператора ве1ес~ Оператор яе1есс определяет конкретный тип элементов, получаемых по запросу.
Ниже приведена его общая форма. яе1есс ямражение Внимательно проанализируем оператор о гдегЬу в следующем запросе из приведенной выше программы. 650 Часть!. Язык б№ В предыдущих примерах оператор яе1ест использовался для возврата переменной диапазона. Поэтому выражение в нем просто обозначало имя переменной диапазона. Но применение оператора яе1есс не ограничивается только этой простой функцией.
Он может также возвращать отдельную часть значения переменной диапазона, результат выполнения некоторой операции или преобразования переменной диапазона и даже новый тип объекта, конструируемого из отдельных фрагментов информации, извлекаемой из переменной диапазона. Такое преобразование исходных данных называется проецированием. Начнем рассмотрение других возможностей оператора яе1есс с приведенной ниже программы. В этой программе выводятся квадратные корни положительных значений, содержащихся в массиве типа с(оц)>1е. // Использовать оператор яе1есс для возврата квадратных корней всех положительных значений, содержащихся в мвааиве типа аоцЛ1е.
ця1пч Яуясепц цягпа Яуясещ.11пцг с1аяя Яе1есапещо ( ягва1с нога Мвтп() ( г(оцЛ1е() пцщя = ( -10.0, 16.4, 12.125, 100.85, -2.2, 25.25, -3.5 ); Сформировать запрос нв получение квадратных корней всех положительных значений, содержащихся в маасиве пцщя. няг яйгйоося = Ггощ и 1п пцщя нпеге и > 0 яе1еса МеГЛ.ЯЧгс(п)г Сопяо1е.иг1аесгпе("Квадратные корни положительных значений,Хп" "округленные до двух десятичных цифр:"); Выполнить запрос и вывести его результаты.
Еагеасй(г(оцЬ1е г гв яцгкооая) Сопяо1е.нг1геьтпе ("(О: $. 44) ", г); ) ) Эта программа дает следующий результат. Квадратные корни положительных значений, округленные до двух десятичных цифр: 4.05 3.48 10.04 5.02 Обратите особое внимание в данном примере запроса на следующий оператор яе1есс. яе1еса МвГЛ.ЯЧга(п); Он возвращает квадратный корень значения переменной диапазона. Для этого значение переменной диапазона передается методу МаТЬ. Яа(гг (), который возвращает Глава 19.
ЫМВ 651 квадратный корень своего аргумента. Это означает, что последовательность результатов, получаемых при выполнении запроса, будет содержать квадратные корни положительных значений, хранящихся в массиве ппвя. Если обобщить этот принцип, то его эффективность станет вполне очевидной. Так, с помощью оператора ве1ест можно сформировйть любой требующийся тип последовательности результатов, исходя из значений, получаемых из источника данных. Ниже приведена программа, демонстрирующая другое применение оператора ве1есг. В этой программе сначала создается класс Ева11Аббгеяя, содержащий два свойства.
В первом из них хранится имя адресата, а во втором — адрес его электронной поч~ы. Затем в этой программе создается массив, содержащий несколько элементов данных типа Ева11Аббгея в. И наконец, в данной программе создается список, состоящий ~олько из адресов электронной почты, извлекаемых по запросу. Возвратить часть значения переменной диапазона. оя1пч Буасевс ояьпд Буясевнйпйс с1аяя Ева11Аббгевя ( рпЬ1гс втггпч Маме ( с)егс яесп рпЫгс вггьпд Адбгевв ( Вепп веЮ роЫпс Ева11Аббгеяв(всггпд и, всггпч а) ( паве = и; Аобгеяя = а! ) с1аяя Бе1есгоево2 ( всасгс чо1б Маго() ( Еваг1лббгеяя() аббгя = ( пек Ева11Аббгеяя("Герберт", "НегойнегЬБсЫ1бг.сов"), пем Егаа11Аббгеяя("томГЬ "товфНегЬБсЫ1бс.сов"), пен Еваг1лббгевя("Сара", "БагазнегЬБсЫ1бс.сов") ): /с' Сформировать запрос на получение адресов с'с' электронной почты.
чаг еАббгя = Гсов еппгу гп аббгв яе1есс епсгу.лббгеяя; Сопяо1е.нгьпеЬгпе("Адреса электронной почты:"); с'с' Выполнить запрос и вывести его результаты. Гогеась(ясгьпэ я гп еАббгв) Сопяо1е.мгьсевьпе(" " + я); Вот к какому результату приводит выполнение этой программы. Адреса электронной почты: НегЬСНегЬБсЫ1дс.сов 652 Часть!. Язык С№ ТоввНегЬЯсЫ1бг.сов ЯагаВНегЬЯсЫ1бС.сов Обратите особое внимание на следующий оператор яе1есс.
ве1есг епггу.хдбгеяя; Вместо полного значения переменной диапазона этот оператор возвращает лишь его адресную часть (Аббге я я). Это означает, что по данному запросу возвращается последовательность символьных строк, а не объектов типа Ева11Аббгеяя. Именно поэтому переменная я указывается в цикле ТогеасЬ как ягг1пср Ведь как пояснялось ранее, тип последовательности результатов, возвращаемых по запросу, определяется типом значения, возвращаемым оператором яе1есг. Одной из самых эффективных для оператора яе1есс является возможность возвращать последовательность результатов, содержащую элементы данных, формируемые во время выполнения запроса.
В качестве примера рассмотрим еще одну программу. В ней определяется класс Сопгасс1ЬТо, в котором хранится имя, адрес электронной почты и номер телефона адресата. Кроме того, в этой программе определяется класс Ева11Ас)с1гезя, исггользовавшийся в предыдущем примере. В методе иа1п () создастся массив объектов типа Сопгасг1п1о, а затем объявляется запрос, в котором источником данных служит этот массив, но возвращаемая последовательность результатов содержит объекты типа Ева№1Аббгевя. Таким образом, типом последовательности результатов, возвращаемой оператором яе1есс, является класс Ева11Аббгезя, а не класс Сопгасг1пго, причем его объекты создаются во время выполнения запроса.
О Использовать запрос длн получения последовательности объектов !/ типа Еваь1Аббгеввев из списка объектов типа Сопгасс1пто. ияьпс Яуясев; ив1пд Яувгев.вьпя; с1аяя Сопгасг1пто ( роЫьс всг1иэ Мазе ( Чегг яег; роЫ1с всгьпэ Ева11 ( Чегс яег; ) риЬ1ьс ясгьпэ РЬопе ( Чегг яегс ) роЫьс Сопгасг1пго(яггьпд и, яггьпс) а, вгг1ис р) ( Мате = и; Ева11 = а; РЬопе = р; с1аяя Ева11Аббгеяв ( риЫьс вгг1пд Мазе ( дес; вес; ) роЫьс ягг1ич Аббгеяя ( сег; яег; риЫьс Ева11Аббгевя(ясгьии и, яггьпо а) Мазе = и; Аббгеяя = а; с1авв Яе1есгбевоз ( вгагьс чо1б На1п() ( Глава 19.
Ыйо баа Сопгасг1пто() соьгасся = ( пен Сопсасс1пто("Герберт", "НегЫНегЬЯСЬ11бс.соп1", "555-1010"), пен Сопсасс1пто("ТомГЬ "Тот6НегЬЯсь11бс.сош", "555-1101"), лен Соптасс1пто("Сара", "яага6НегЬясЬ11бс.сот", "555-0110") Сформировать запрос на получение списка объектов типа Еша11АСь(геяя. чаг ешаг111яс = Тгош епсгу гп сопсасся яе1есс пен Еша11Аг)бгеяя(епсгу.наше, епсгу.Ета11); Сопяо1е.нг1геььпе("Список адресов электронной почты:"); Выполнить запрос и вывести его результаты.
Тогеась(Еша11Аббгеяя е гп еша1111яс) Сопяо1е.нг1сеЬ1пе(" (О): (1)", е.наше, е.ьбс(геяя Ниже приведен результат выполнения этой программы. Список адресов электронной почты: Герберт: НегЬ6негЬЯсь11с(с.сош Том: Тот6НегЬЯса11бс.сот Сара: 5ага6НегЬяса11сс.сот Обра~и~е особое внимание в данном запросе на следующий оператор яе1есс.