Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_ПАРАДИГМИ ПРОГРАМУВАННЯ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.32 Mб
Скачать

12.5. 3. Дозвіл компілятору визначати відомості про типа

Не дивлячись на те, що необхідно знанти про стосунки типів в операції запиту, існує можливість передачі виконання всіх дій компілятору. Ключове слово var можна використовувати для будь-якої локальної змінної в операції запиту (рис. 12.7). Компілятор в цьому випадку вказуватиме строгий тип для кожної змінної в операції запиту.

INCLUDEPICTURE "http://www.intuit.ru/department/internet/mwebtech/10/08_07.gif" \* MERGEFORMATINET

Рис.12.7.  Визначення компілятором відомостей про тип

12.6. Синтаксис запиту або синтаксис методу

У попередніх прикладах більшість запитів написані як вирази запитів за допомогою декларативного синтаксису запиту, представленого в C# 3.0. Проте в самому загальномовному середовищі виконання (CLR) .NET відсутнє поняття синтаксису запиту. Таким чином, під час компіляції вирази запиту перетворяться в те, що зрозуміло CLR – виклики методів. Ці методи називаються стандартними операторами запитів, і вони мають такі імена, як Where, Select, GroupBy, Join, Мах, Average і так далі Їх можна викликати безпосередньо, використовуючи синтаксис методів замість синтаксису запитів.

В цілому, рекомендується синтаксис запитів, оскільки зазвичай він простіший і легко читається; проте між синтаксисом методів і синтаксисом запитів немає семантичної різниці. Крім того, деякі запити, наприклад такі, які вибирають кількість елементів, відповідних вказаній умові, або які вибирають елемент, що має максимальне значення у вихідній послідовності, можуть бути виражені лише у вигляді викликів методів. У довідковій документації по стандартних операторах запитів в просторі імен System.Linq зазвичай використовується синтаксис методів. Тому, навіть на початковому етапі написання запитів LINQ корисно знати, як використовувати синтаксис методів в запитах і самих виразах запиту.

12.6.1. Методи розширення стандартних операторів запитів

У наступному прикладі показано просте вираження запиту і семантично еквівалентний йому запит, написаний як запит на основі методу:

class QueryVMethodSyntax

{

static void Main()

{

int[] numbers = { 5, 10, 8, 3, 6, 12 };

//Синтаксис запиту:

IEnumerable<int> numQuery1 =

from num in numbers

where num % 2 == 0

orderby num

select num;

//Синтаксис методу:

IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);

foreach (int i in numQuery1)

{

Console.Write(i + " ");

}

Console.WriteLine(System.Environment.NewLine);

foreach (int i in numQuery2)

{

Console.Write(i + " ");

}

Console.WriteLine(System.Environment.NewLine);

Console.WriteLine("Натискуйте будь-яку кнопку для виходу!");

Console.ReadKey();

}

}

/*

На виході буде отримано:

6 8 10 12

6 8 10 12

*/

Два приклади мають ідентичні результати. Тип змінної запиту однаковий в обох формах: IEnumerable<(Of <(T>)>).

Аби зрозуміти запит на основі методу, розглянемо його детальніше. Звернете увагу, що в правій частині виразу пропозиція where тепер виражена у вигляді методу екземпляра об'єкту numbers, який має тип IEnumerable<int>. Якщо ви знайомі з універсальним інтерфейсом IEnumerable<(Of <(T>)> ), вам відомо, що він не має методу Where. Проте при виклику списку завершення IntelliSense в IDE Visual Studio відображуватиме не лише метод Where, але і багато інших методів, такі як Select, SelectMany, Join і Orderby. Вони всі є стандартними операторами запитів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]