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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

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

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

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

 

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. Вони всі є стандартними операторами запитів.

Лямбда-вирази

У попередньому прикладі умовний вираз (num % 2 == 0) передається як вбудований аргумент методу Where: Where(num => num % 2 == 0). Цей вбудований вираз називається лямбда-виразом. Він є зручним способом написання коду, який інакше довелося б записувати в громіздкішій формі як анонімний метод, універсальний делегат або дерево виразів. У C# => є лямбда-оператором, який читається як "переходить". num зліва від оператора є вхідній змінній, яка відповідає num у виразі запиту. Компілятор може визначити тип num, оскільки йому відомо, що numbers є універсальним типом IEnumerable<(Of <(T>)>). Основна частина лямбда-виразу представляє те саме, що і вираз в синтаксисі запиту або в будь-якому іншому виразі або операторі C#; він може включати виклики методів і іншу складну логіку. Значенням, що повертається є просто результат виразу.

Приступаючи до роботи з LINQ, немає необхідності широко використовувати лямбда-вирази. Проте деякі запити можуть виражатися лише в синтаксисі методів, а деякі з них вимагають лямбда-виразів.

 

 



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 198; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.236.139.73 (0.006 с.)