Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Полное руководство. С# 4.0 - Шилдт Герберт

Полное руководство. С# 4.0 - Шилдт Герберт

Читать онлайн Полное руководство. С# 4.0 - Шилдт Герберт

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 141 142 143 144 145 146 147 148 149 ... 188
Перейти на страницу:

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

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

Методы запроса определяются в классе System.Linq.Enumerable и реализуютсяв виде методов расширения функций обобщенной формы интерфейса IEnumerable.(Методы запроса определяются также в классе System.Linq.Queryable, расширяющем функции обобщенной формы интерфейса IQueryable<T>, но этот интерфейсв настоящей главе не рассматривается.) Метод расширения дополняет функции другого класса, но без наследования. Поддержка методов расширения была внедрена в версию C# 3.0 и более подробно рассматривается далее в этой главе. А до тех пор достаточно сказать, что методы запроса могут вызываться только для тех объектов, которыереализуют интерфейс IEnumerable<T>.

В классе Enumerable предоставляется немало методов запроса, но основными считаются те методы, которые соответствуют описанным ранее операторам запроса. Этиметоды перечислены ниже вместе с соответствующими операторами запроса. Следует,однако, иметь в виду, что эти методы имеют также перегружаемые формы, а здесь онипредставлены лишь в самой простой своей форме. Но именно эта их форма используется чаще всего.Оператор запросаЭквивалентный метод запросаselectSelect(selector)whereWhere(predicate)orderbyOrderBy(keySelector) или OrderByDescending(keySelector)joinJoin(inner, outerKeySelector, innerKeySelector, resultSelector)groupGroupBy(keySelector)

За исключением метода Join(), остальные методы запроса принимают единственный аргумент, который представляет собой объект некоторой разновидностиобобщенного типа Func. Это тип встроенного делегата, объявляемыйследующим образом:delegate TResult Func<in Т, out TResult>(T arg)

где TResult обозначает тип результата, который дает делегат, а Т — тип элемента.В методах запроса аргументы selector, predicate или keySelector определяютдействие, которое предпринимает метод запроса. Например, в методе Where() аргумент prediсаte определяет порядок отбора данных в запросе. Каждый метод запросавозвращает перечислимый объект. Поэтому результат выполнения одного метода запроса можно использовать для вызова другого, соединяя эти методы в цепочку.

Метод Join() принимает четыре аргумента. Первый аргумент (inner) представляетсобой ссылку на вторую объединяемую последовательность, а первой является последовательность, для которой вызывается метод Join(). Селектор ключа для первой последовательности передается в качестве аргумента outerKeySelector, а селектор ключа длявторой последовательности — в качестве аргумента LnnerKeySelector. Результат объединения обозначается как аргумент resultSelector. Аргумент outerKeySelectorимеет тип Func, аргумент innerKeySelector — тип Func, тогда как аргумент resultSelector — тип Func,где TOuter — тип элемента из вызывающей последовательности; Tinner — тип элемента из передаваемой последовательности; TResult — тип элемента из объединяемой в итоге последовательности, возвращаемой в виде перечислимого объекта.

Аргумент метода запроса представляет собой метод, совместимый с указываемойформой делегата Func, но он не обязательно должен быть явно объявляемым методом. На самом деле вместо него чаще всего используется лямбда-выражение. Как пояснялось в главе 15, лямбда-выражение обеспечивает более простой, но эффективныйспособ определения того, что, по существу, является анонимным методом, а компилятор C# автоматически преобразует лямбда-выражение в форму, которая может бытьпередана в качестве параметра делегату Func. Благодаря тому что лямбда-выраженияобеспечивают более простой и рациональный способ программирования, они используются во всех примерах, представленных далее в этом разделе.Формирование запросов с помощью методов запроса

Используя методы запроса одновременно с лямбда-выражениями, можно формировать запросы, вообще не пользуясь синтаксисом, предусмотренным в C# для запросов. Вместо этого достаточно вызвать соответствующие методы запроса. Обратимсясначала к простому примеру. Он представляет собой вариант первого примера программы из этой главы, переделанный с целью продемонстрировать применение методов запроса Where() и Select() вместо соответствующих операторов.// Использовать методы запроса для формирования простого запроса.// Это переделанный вариант первого примера программы из настоящей главы.using System;using System.Linq;class SimpQuery { static void Main() { int[] nums = { 1, -2, 3, 0, -4, 5 }; // Использовать методы Where() и Select() для // формирования простого запроса. var posNums = nums.Where(n => n > 0).Select(r => r); Console.Write("Положительные значения из массива nums: "); // Выполнить запрос и вывести его результаты. foreachfint i in posNums) Console.Write(i + " "); Console.WriteLine(); }}

Эта версия программы дает такой же результат, как и исходная.Положительные значения из массива nums: 1 3 5

Обратите особое внимание в данной программе на следующую строку кода.var posNums = nums.Where(n => n > 0).Select(r => r);

В этой строке кода формируется запрос, сохраняемый в переменной posNums. Поэтому запросу, в свою очередь, формируется последовательность положительных значений, извлекаемых из массива nums. Для этой цели служит метод Where(), отбирающий запрашиваемые значения, а также метод Select(), избирательно формирующийиз этих значений окончательный результат. Метод Where() может быть вызван длямассива nums, поскольку во всех массивах реализуется интерфейс IEnumerable,поддерживающий методы расширения запроса.

Формально метод Select() в рассматриваемом здесь примере не нужен, поскольку это простой запрос. Ведь последовательность, возвращаемая методом Where(), ужесодержит конечный результат. Но окончательный выбор можно сделать и по болеесложному критерию, как это было показано ранее на примерах использования синтаксиса запросов. Так, по приведенному ниже запросу из массива nums возвращаютсяположительные значения, увеличенные на порядок величины.var posNums = nums.Where(n => n > 0).Select(r => r * 10);

Как и следовало ожидать, в цепочку можно объединять и другие операции над данными, получаемыми по запросу. Например, по следующему запросу выбираются положительные значения, которые затем сортируются по убывающей и возвращаются ввиде результирующей последовательности:var posNums = nums.Where(n => n > 0).OrderByDescending(j => j);

где выражение j => j обозначает, что упорядочение зависит от входного параметра,который является элементом данных из последовательности, получаемой из методаWhere().

В приведенном ниже примере демонстрируется применение метода запросаGroupBy(). Это измененный вариант представленного ранее примера.// Продемонстрировать применение метода запроса GroupBy().// Это переработанный вариант примера, представленного ранее// для демонстрации синтаксиса запросов.using System;using System.Linq;class GroupByDemo { static void Main() { string[] websites = { "hsNameA.com", "hsNameB.net", "hsNameC.net", "hsNameD.com", "hsNameE.org", "hsNameF.org", "hsNameG.tv", "hsNameH.net", "hsNameI.tv" }; // Использовать методы запроса для группирования // веб-сайтов по имени домена самого верхнего уровня. var webAddrs = websites.Where(w => w.LastIndexOf('.') != 1). GroupBy(x => x.Substring(x.LastIndexOf(".", x.Length))); // Выполнить запрос и вывести его результаты. foreach(var sites in webAddrs) { Console.WriteLine("Веб-сайты, сгруппированные " + "по имени домена " + sites.Key); foreach(var site in sites) Console.WriteLine(" " + site); Console.WriteLine(); } }}

1 ... 141 142 143 144 145 146 147 148 149 ... 188
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Полное руководство. С# 4.0 - Шилдт Герберт.
Комментарии