Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 122
Текст из файла (страница 122)
(Подробнее о методах расширения речь пойдет далее в этой главе.) А получающаяся в итоге последовательность групп возвращается оператором зе1есп. Применение оператора 1е~ для создания временной переменной в запросе Иногда возникает потребность временно сохранить некоторое значение в самом запросе. Допустим, что требуется создать переменную перечнслимого типа, которую можно будет затем запросить, нли же сохранить некоторое значение, чтобы в,дэльнейшем использовать его в операторе нпеге. Независимо от преследуемой цели, эти виды функций могут быть осуществлены с помощью оператора 1ег. Ниже приведена общая форма оператора 1еС.
1еп ныл выражение где нмя обозначает идентификатор, получающий значение, которое дает выражение. Тип имени выводится из типа выражения. В приведенном ниже примере программы демонстрируется применение оператора 1ес для создания еще одного перечислимого источника данных. В качестве входных данных в запрос вводится массив символьных строк, которые затем преобразуются в массивы типа спал.
Для этой цели служит еще один метод обработки строк, называемый тосьаглггау () и возвращающий массив, содержащий символы в строке. Полученный результат присваивается переменной спглггау, которая затем используется во вложенном операторе ггож для извлечения отдельных символов из массива. И наконец, полученные символы сортируются в запросе, и из них формируется результирующая последовательность. О Использовать оператор 1ес в месте с вложенным // оператором Ггоп. ивьпп зувоепп пв1пч зувпвж.ъгпЧ; 634 Часть(.
язык Сз с1авя Ьесоещо ( ясасьс чогб Мати() ( яггьпд [) яггя = ( "а1рьа", "ьега", "свища" // Сформировать запрос иа получение символов, // возвращаемых из строк в отсортированной // последовательности. Обратите виимаиие иа // применение вложенного оператора ггощ. чаг спгя = ггощ ягг 1п яггя 1ес спгаггау = ясг.тоСЬагаггау() ггощ сЬ 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есг ия) Глава )9.
'ь)п0 635 В этом варианте индекс последнего вхождения символа точки в строку присваивается переменной 1с)х. Данное значение затем используется в методе Вп)эзсг1пд П . Благодаря этому исключается необходимость дважды искать символ точки в строке. Обьединение двух последовательностей с помощью оператора 1о~п Когда приходится иметь дело с базами данных, то зачастую требуется формировать последовательность, увязывающую данные из разных источников. Например, в Интернет- магазине может быть организована одна база данных, связывающая наименование товара с его порядковым номером, а другая база данных, связывающая порядковый номер товара с состоянием его запасов на складе. В подобной ситуации может возникнуть потребность составить список, в котором состояние запасов товаров на складе отображается по их наименованию, а не порядковому номеру.
Для этой цели придется каким-то образом увязать данные из двух разных источников (баз данных). И это нетрудно сделать с помощью такого средства ).1ХЯ, как оператор «охп. Ниже приведена общая форма оператора «суп (совместно с оператором 1гов). Егов переменная диапазона А 1п источник данных А «оъп переменная диапазона В 1п источник данным В оп переменная диапазона А.свойство едиаХя переменная диапазона В.свойство Применяя оператор «о1п, следует иметь в виду, что каждый источник должен содержать общие данные, которые можно сравнивать.
Поэтому в приведенной выше форме этого оператора источник данных А и источник данных В должны иметь нечто общее, что подлежит сравнению. Сравниваемые элементы данных указываются в части оп данного оператора. Поэтому если переменная диапазона А. свойство и переменная диапазона А. свойство равны, то эти элементы данных увязываются успешно. По существу, оператор «о1п выполняет роль своеобразного фильтра, отбирая только те элементы данных, которые имеют общее значение.
Как правило, оператор «о«п возвращает последовательность, состоящую из данных, полученных из двух источников. Следовательно, с помощью оператора «сап можно сформировать новый список, состоящий из элементов, полученных из двух разных источников данных. Это дает возможность организовать данные по-новому. Ниже приведена программа, в которой создается класс «сев, инкапсулирующий наименование товара и его порядковый номер. Затем в этой программе создается еще один класс Хпзсос аз гас па, связывающий порядковый номер товара с булевым свойством, которое указывает на наличие или отсутствие товара на складе.
И наконец, в данной программе создается класс тевр с двумя полями: строковым (зггупд) и булевым (Ьоо«). В объектах этого класса будут храниться результаты запроса. В этом запросе оператор «оуп используется для получения списка, в котором наименование товара связывается с состоянием его запасов на складе. // Продемонстрировать применение оператора «оьп. пяъпд Вуясевл пя1пд Вуятев.ььпд; О Класа, связывающий наименование товара с // его порядковым номером. 636 Часть!. язык С» с1авя 1кев ( риЬ11с якк1пс Мазе ( сект яект ) риЬ11с Тпс 1кевнивЬег ( фест яекк риЬ11с 1кев(якгфпд и, 1пк Тпив) ( ыаве = пт 1кевыивоег = алиям ) ) // Класс, связывающий наименование товара с // состоянием его запасов на складе.
с1аяя 1пБСосКБСакия ( риЬ11с Тпк 1кевнивЬек ( сект яект риЬ11с Ьоо1 1пзкосй ( Яект яект ) риЬ11с 1пакосКБСакия(1пс и, Ьоо1 Ь) ( 1кевнивюек = пт ТпЯСоса = Ьт ) // Класс, инкапсулирующий наименование товара и // состояние его запасов на складе. с1аяя Тевр ( риЬ11с яккапд Ыаве ( дев) яек) ) риЬ11с Ьоо1 ХпБСоск ( сект яек) ) с1аяв Поюпоево ( якакас чоаб Иа1п() ( 1вев[] Ткевя = ( пен 1кев(ЯКусачки", 1424), пен Ткев("Тиски", 7892), пен 1кев("Молоток", 8534), пен 1кев(8йила", 5411) // Сформировать запрос, объединяющий объекты // классов Ткев и 1пакосКБСакия для составления риЬ11с Тевр(яккапй и, Ьоо1 Ь) ( ыаве = и) 1ЬБСоса = Ь) ) ) 1пБСосКБСасия[] якакия11яс пен 1пБСоскзкакия(1424, пен 1паиосКЯСасия(7892, пен 1пзкоскБСакия(8534, пен 1пЯСосКЯСаиия(6411, )) ( якие), Га1яе), ские), ские) Глава!9, 1)МО 637 // списка наименований товаров и их наличия на // складе.
Обратите внимание на формирование // последовательности объектов класса Тевр. наг ЕпзоосКЬЕяС = Етов 1Сев Еп Егевя )огп еппту Еп ягагпяьсяг оп ЕСев.1СевновЬет еппа1я епсту.1СевншпЬет яе1есг пен Тевр(1Сев.маме, епгту.1пзтосК); Сопяо1е.нтссеьспе("Товар1сналичие1п")1 // Выполнить запрос и вывести его результаты. Еотеасп(Тевр С Еп ЕпЯСосКЪдяг) Сопяо1е.нт1Сеьспе(п(0) КС(1)", С.паве, С.1пЯСосК); Эта программа дает следующий результаг. Товар Наличие Кусачки Ттпе Тиски Га1яе Молоток Ттпе Пила Ттпе Для того чтобы стал понятнее принцип действия оператора Яофп, рассмотрим каждую строку запроса из приведенной выше программы по порядку. Этот запрос начинается, как обычно, со следующего оператора Егов: наг ЕпзгосКьгег = Етов Егев гп Егевя В этом операторе указывается переменная диапазона Есев для источника данных Есевя, который представляет собой массив объектов класса 1сев. В классе 1сев инкапсулируются наименование товара и порядковый номер товара, хранящегося на складе.
Далее следует приведенный ниже оператор и ОЕп. Яогп епгту Еп ягатпяьтяС оп Егев.1СевншпЬет епоа1я ептту.1СевншпЬет В этом операторе указывается переменная диапазона епсгу для источника данных ясаспя11яс, который представляет собой массив объектов класса 1пзсосКЯсаспя, связывающего порядковый номер товара с состоянием его запасов на складе. Следовательно, у массивов ЕСевя и ЯСатпяЬЕЯС имеется общее свойство: порядковый номер товара. Именно это свойство используется в части оп/еп(па15 оператора 1офп для описания связи, по которой из двух разных источников данных выбираются наименования товаров, когда их порядковые номера совпадают.
И наконец, оператор яе1есС возвращает объект класса тевр, содержащий наименование товара и состояние его запасов на складе. яе1есг пен Тевр(1Сев.паве, епгту.1пзгосК) Таким образом, последовательность результатов, получаемая по данному запросу, состоит из объектов типа Тевр. 638 часть (. язык Сз Рассмотренный здесь пример применения оператора боуп довольно прост. Тем не менее этот оператор поддерживает и более сложные операции с источниками данных.
Например', используя совместно операторы 1псо и боъп, можно создать г)н/пновое обьединение, чтобы получить результат, состоящий из первой последовательности и группы всех совпадающих элементов из второй последовательности. (Соответствующий пример будет приведен далее в этой главе.) Как правило, время и усилия, затраченные на полное освоение оператора боъп, окупаются сторицей, поскольку он дает возможность распознавать данные во время выполнения программы. Это очень ценная возможность. Но она становится еще ценнее, если используются анонимные типы, о которых речь пойдет в следующем разделе. Анонимные типы В версии СФ 3.0 внедрено новое средство, называемое анонииныз( нкипои и связанное непосредственно с Е1ЫЯ.