|
Программирование >> Программирование с использованием ajax
Лямбда-выражения Большинство методов 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 для продолжения:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |