Программирование >>  Программирование с использованием ajax 

1 ... 264 265 266 [ 267 ] 268 269 270 ... 396


Если запрос может вернуть множество элементов, то этот тип должен вести себя как коллекция объектов из источника данных запроса (технически - это не коллекция; она лишь выглядит так).

Если вы хотите знать подробности, то скажем, что результат запроса будет типом, реализующим интерфейс lEnumerableo. В данном конкретном случае компилятор создает экземпляр System,Linq, OrderSequence<stringf string>- специального типа данных LINQj который представляет упорядоченный список строк (потому что источник данных- коллекция строк).

Кстати, имя queryResult произвольно - вы можете назвать результат так, как вам нравится. Это может быть namesBeginningWithS или что-нибудь другое, что имеет смысл внутри программы.

Спецификация источника данных: конструкция from

Следующая часть запроса LINQ - конструкция from, которая специфицирует источник запрашиваемых данных:

from п in names

Источником данных в рассматриваемом случае является names - массив строк, объявленный ранее. Переменная п - просто заместитель индивидуальных элементов в источнике данных, подобно переменной паше, следующей за оператором foreach. Специфицируя from, вы сообщаете о том, что собираетесь запросить подмножество коллекции, а не выполнять итерацию по всем элементам.

Говоря об итерации, мы подразумеваем, что источник данных LINQ должен быть перечислимым - т.е. он должен быть массивом или коллекцией элементов, из которой их можно извлекать по одному.

Технически это означает, что источник данных должен поддерживать интерфейс lEnumerableo, что присуще любому массиву или коллекции элементов С#.

Источник данных не может быть единственным значением или объектом, таким как отдельная переменная int. И в самом деле, если уже имеется единственный элемент, зачем его запрашивать?

Спецификация условия: конструкция where

в следующей части запроса LINQ вы специфицируете условие запроса, используя конструкцию where, которая выглядит так:

where п.StartWith( S )

В конструкции where может быть специфицировано любое булевское выражение, которое применимо к элементам в источнике данных. На самом деле конструкция where не обязательна, и даже может быть опущена, но почти во всех случаях понадобится специфицировать условие where, чтобы ограничить результат только необходимыми данными. Конструкция where называется ограничивающей операцией в LINQ, потому что она ограничивает результат запроса.

Здесь вы специфицируете, что строка name должна начинаться с буквы S, но можно было бы специфицировать что-нибудь другое вместо этого, например, что длина должна быть больше 10 (where п. Length > 10) или имя должно содержать в себе букву Q (where п. Contains ( Q )).



Выбор элементов: конструкция select

и, наконец, конструкция select специфицирует, какие элементы появятся в результирующем наборе. Выглядит она так:

select п

Конструкция select необходима, потому что вы должны специфицировать элементы, которые запрос поместит в результирующий набор. Для рассматриваемого набора данных это не очень интересно, поскольку в каждом объекте результирующего набора есть только один элемент - имя. Далее будут показаны некоторые примеры более сложных объектов в результирующем наборе, где полезность конструкции select будет более наглядной, а пока давайте завершим наш первый пример.

Последний штрих: использование цикла foreach

Теперь вы печатаете результаты запроса. Подобно массиву, использованному в качестве источника данных, результат запроса LINQ вроде этого является перечислимым (enumerable) - в том смысле, что вы можете выполнить итерацию по результату с помощью оператора foreach:

Console.WriteLine( Имена, начинающиеся с S: ); foreach (var item in queryResults) { Console.WriteLine (item) ;

В этом случае получается совпадением с четырьмя именами - Singh, Small, Smythe и Samba, и именно они будут выведены в цикле foreach.

Отложенное выполнение запроса

Можете показаться, что цикл foreach не является частью самого LINQ- ведь он просто перебирает полученные результаты. Хотя это и верно, что конструкция foreach не принадлежит только LINQ, тем не менее, это часть кода, которая в действительности выполняет запрос LINQ! Присваивание результата запроса переменной лишь сохраняет план его выполнения; в LINQ сами данные не извлекаются до тех пор, пока не выполнено обращение к результату. Это называется отложенным выполнением запроса, или ленивым выполнением запроса. Выполнение откладывается для любого запроса, производящего последовательности, т.е. список результатов.

Теперь вернемся к коду. Поскольку результаты распечатаны, давайте завершим программу:

Console.Write( Программа завершена, нажмите Enter для продолжения: ); Console.ReadLine();

Эти строки лишь гарантируют, что результаты консольной программы останутся на экране до тех пор, пока вы не нажмете клавишу, даже если вы запустите ее нажатием <F5> вместо <Ctrl+F5>. Эта конструкция будет применяться и в других примерах LINQ.

Использование синтаксиса методов LINQ и лямбда-выражений

в LINQ существует много способов решения одной и той же задачи, как это часто бывает в программировании. Как уже отмечалось, предыдущий пример написан с использованием синтаксиса запросов LINQ. В следующем примере вы напишете ту же



программу с применением синтаксиса методов LINQ (также известного, как явный синтаксис, но мы будем называть его синтаксисом методов).

Расширяющие методы LINQ

LINQ реализован в виде серии расширяющих методов коллекций, массивов, результатов запросов и любых других объектов, реализующих интерфейс lEnumerable. Вы можете видеть эти методы в средстве IntelliSense Visual Studio. Например, откройте файл Program. CS только что скомпилированной программы 26-1-FirstLINQquery в Visual С# 2008 и введите новую ссылку на тот же массив names, как показано ниже:

string[] names = { Alonso , Zheng , Smith , Jones , Smythe , Small , Ruiz , Hsieh , Jorgenson , Ilyich , Singh , Samba , Fatimah };

names.

Как только вы введете точку после names, то сразу увидите в раскрывающемся списке IntelliSense все доступные методы объекта names, как показано на рис. 26.1.

SyncRoot Take о TakeWhIleo ToArray о ToDlctlonaryo ToLlstO ToLookupO ToString Union <>

n(extenslon) lEnumerable <TSource> lEnumerable <TSource> Where <Т5оигсв> [Filters a sequence of values based on a predicate. Each elements index Is used

Puc. 26.1. Работа средства IntelliSense

Метод WhereO и большинство прочих доступных методов являются расширяющими методами (что отмечено в документации словом extension, следующим за Whereo). Вы можете увидеть, что они являются расширениями LINQ, если закомментируете директиву using System.Linq в начале файла. Тогда WhereO, UnionO, Takeso и большинство других методов исчезнут из этого списка. Выражение запроса for. . .where. . .select, использованное в предыдущем примере, транслируется компилятором С# в серию вызовов этих методов. При использовании синтаксиса методов LINQ вы вызываете эти методы напрямую.

Синтаксис запросов в сравнении с синтаксисом методов

Синтаксис запросов является предпочтительным способом программирования запросов в LINQ, поскольку его намного легче читать и проще использовать в большинстве часто применяемых запросов. Однако важно иметь базовое понятие о синтаксисе методов, поскольку некоторые возможности LINQ либо недоступны в синтаксисе запросов, либо просто их легче применять в синтаксисе методов.

Как рекомендует онлайновая справочная система Visual С# 2008, используйте синтаксис запросов, когда возможно, и синтаксис методов, когда необходимо.

В этой главе применяется в основном синтаксис запросов, но будут показаны ситуации, когда необходим синтаксис методов, и продемонстрировано, как использовать синтаксис методов для решения проблемы.



1 ... 264 265 266 [ 267 ] 268 269 270 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика