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

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


Лямбда-выражения

Большинство методов LINQ, использующих синтаксис методов, требуют передачи метода или функции для вычисления выражения запроса. Параметр типа метода/ функции передается в форме делегата, который часто называют анонимным методом.

К счастью, LINQ позволяет сделать это намного проще, чем можно предположить! Вы создаете метод/функцию, используя специальную конструкцию С# 3.0, которая называется лямбда-выражением (lambda expression). Лямбда-выражение представляет собой короткий, согласованный способ записи анонимного метода, применяемый для вычисления выражений запроса. Ниже показано простое лямбда-выражение:

п => п < 1000

Операция => называется лямбда-операцией.

Лямбда здесь происходит от лямбда-исчисления - математического понятия, лежащего в основе функциональных языков программирования. Функциональное программирование - это разновидность программирования, на котором базируется LINQ. Объяснение деталей выходит за рамки настоящей книги, но если вам интересно, можете поискать дополнительную информацию в статье Wikipedia, посвященной лямбда-исчислению. Вам не нужно понимать математические детали, чтобы использовать лямбда-выражения, хотя понимание функционального программирования полезно для профессионального программирования на LINQ. См. раздел Ресурсы для дополнительного изучения в конце этой главы.

Лямбда-выражение - это сокращенный способ определения функции. Например, лямбда-выражение п => п < 1000 определяет функцию, которая принимает параметр по имени п и возвращает true, если п меньше 1000, и false - в противном случае. Функция представлена анонимным методом, не имеющим названия, который используется только там, где это лямбда-выражение передается лежащему в основе методу LINQ.

Система онлайновой справки Visual С# 2008 советует читать это лямбда-выражение, как п идет к п больше 1000 (п goes to n greater than 1000), хотя булевские лямбда-выражения вроде этого предпочтительнее читать как п такое, что п меньше 1000 (п such that n is less than 1000).

Лямбда-выражение для запроса в первом примере программы может быть записано, как

п => п.StartsWith( S ));

что следует читать, как п такое, что начинается с S .

Попробуйте применить это в действительной программе для более ясного представления.

Практическое занятие Использование синтэксиса методов LINQ

и лямбда-выражений

Выполните следующие шаги для создания примера в Visual С# 2008.

1. Вы можете либо модифицировать пример 26-1-FirstLINQQuery, либо создать новое консольное приложение по имени 2 6-2-LINQMethodSyntax в каталоге C:\BegVCSharp\Chapter2 6. Откройте главный файл Program.cs.

2. Visual С# 2008 автоматически включает нужное пространство имен в Program.cs:

using System.Linq;



3. Добавьте следующий код в метод Main () в Program, cs. Ниже выделен только отличающийся от первого примера код:

static void Main(string[] args) {

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

var queryResults = names .Where (n => n. StartsWith ( S )) ;

Console.WriteLine( Имена, начинающиеся с S: );

foreach (var item in queryResults) { Console.WriteLine(item);

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

4. Скомпилируйте и запустите эту программу (можно просто нажать <F5>). Вы увидите тот же вывод списка имен, начинающихся с S, в порядке, в котором они объявлены в массиве, как показано ниже:

Имена, начинающиеся с S:

Smith

Smythe

Small

Singh

Samba

Программа завершена, нажмите Enter для продолжения:

Описание полученных результатов

Как и ранее, ссылка на пространство имен System.Linq вставляется автоматически Visual С# 2008:

using System.Linq;

Те же исходные данные, что и ранее, создаются вновь с помощью объявления и инициализации массива имен:

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

Отличающаяся часть - запрос LINQ, который теперь вызывает метод WhereO вместо выражения запроса:

var queryResults = names.Where (n => n.StartsWith ( S ));

Компилятор C# превращает лямбда-выражение n => n. StartsWith ( S ) в анонимный метод, выполняемый Where () на каждом элементе массива names. Если лямбда-выражение возвращает для элемента true, он включается в результат, возвращаемый Where (). Компилятор С# определяет, что Where () должен принимать string в качестве входного типа для каждого элемента входного источника (в данном случае - массива names).

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

Остальная часть примера та же, что и в предыдущем случае - вы просто печатаете результаты запроса в цикле foreach и приостанавливаете вывод в конце, чтобы можно было увидеть его перед тем, как программа завершится:



foreach (var item in queryResults) { Console.WriteLine(item);

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

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

Упорядочивание результатов запроса

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

Практическое занетд* ! ЗапрОСа

Выполните следующие шаги для создания нового примера в Visual С# 2008.

1. Вы можете либо модифицировать первый пример 26-1-FirstLINQQuery, либо создать новый проект консольного приложения по имени 2б-3-OrderQuery Results в каталоге C:\BegVCSharp\Chapter26.

2. Откройте главный файл Program.cs. Как и ранее. Visual С# 2008 автоматически включает директиву using System. Linq; в Program, cs.

3. Добавьте следующий код в метод Main () в Program.cs. Код, отличающийся от первого примера, выделен полужирным:

static void Main(string[] args) {

string[] names = { Alonso , Zheng , Smith , Jones , Smythe ,

Small , Ruiz , Hsieh , Jorgenson , Ilyich , Singh , Samba , Fatimah };

var queryResults = from n in names where n.StartsWith ( S ) orderby n select n;

Console.WriteLine( Имена, начинающиеся с S, в алфавитном порядке: ); foreach (var item in queryResults) { Console.WriteLine(item);

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

4. Откомпилируйте и выполните программу. Вы увидите имена, начинающиеся с S в алфавитном порядке, как показано ниже:

Имена, начинающиеся с S, в алфавитном порядке:

Samba

Singh

Small

Smith

Smythe

Программа завершена, нажмите Enter для продолжения:



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

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