Для обращения к источнику данных по запросу, сформированному средствами LINQ, в этом источнике должен быть реализован интерфейс IEnumerable. Он име ет две формы: обобщенную и необобщенную. Как правило, работать с источником данных легче, если в нем реализуется обобщенная форма IEnumerable, где Т обо значает обобщенный тип перечисляемых данных. Здесь и далее предполагается, что в источнике данных реализуется форма интерфейса IEnumerable. Этот интерфейс объявляется в пространстве имен System.Collections.Generic. Класс, в котором реализуется форма интерфейса IEnumerable, поддерживает перечисление, а это означает, что его содержимое может быть получено по очереди или в определенном порядке. Форма интерфейса IEnumerable поддерживается всеми массивами в С#. Поэтому на примере массивов можно наглядно продемонстрировать основные прин ципы работы LINQ. Следует, однако, иметь в виду, что применение LINQ не ограни чивается одними массивами. Простой запрос
А теперь самое время обратиться к простому примеру использования LINQ. В при веденной ниже программе используется запрос для получения положительных значе ний, содержащихся в массиве целых значений. // Сформировать простой запрос LINQ. using System; using System.Linq; class SimpQuery { static void Main { int[] nums = { 1, -2, 3, 0, -4, 5 }; // Сформировать простой запрос на получение только положительных значений. var posNums = from n in nums where n > 0 select n; Console.Write("Положительные значения из массива nums: "); // Выполнить запрос и отобразить его результаты. foreach(int i in posNums) Console.Write(i + " "); Console.WriteLine; } }
Эта программа дает следующий результат. Положительные значения из массива nums: 1 3 5
Как видите, в конечном итоге отображаются только положительные значения, хра нящиеся в массиве nums. Несмотря на всю свою простоту, этот пример наглядно де монстрирует основные возможности LINQ. Поэтому рассмотрим его более подробно.
Прежде всего обратите внимание на применение в данном примере программы следующего оператора. using System.Linq;
Для применения средств LINQ в исходный текст программы следует включить про странство имен System.Linq.
Затем в программе объявляется массив nums типа int. Все массивы в C# неявным образом преобразуются в форму интерфейса IEnumerable. Благодаря этому лю бой массив в C# может служить в качестве источника данных, извлекаемых по запросу LINQ.
Далее объявляется запрос, по которому из массива nums извлекаются элементы только с положительными значениями. var posNums = from n in nums where n > 0 select n;
Переменная posNums называется переменной запроса. В ней хранится ссылка на ряд правил, определяемых в запросе. Обратите внимание на применение ключевого слова var для объявления переменной posNums неявным образом. Как вам должно быть уже известно, благодаря этому переменная posNums становится неявно типизирован ной. Такими переменными удобно пользоваться в запросах, хотя их тип можно объя вить и явным образом (это должна быть одна из форм интерфейса IEnumerable). Объявляемой переменной posNums в итоге присваивается выражение запроса.
Все запросы начинаются с оператора from, определяющего два элемента. Первым из них является переменная диапазона, принимающая элементы из источника данных. В рассматриваемом здесь примере эту роль выполняет переменная n. Вторым элемен том является источник данных (в данном случае — массив nums). Тип переменной диа пазона выводится из источника данных. Поэтому переменная n относится к типу int. Ниже приведена общая форма оператора from. from переменная_диапазона in источник_данных
Далее следует оператор where, обозначающий условие, которому должен удо влетворять элемент в источнике данных, чтобы его можно было получить по запросу. Ниже приведена общая форма синтаксиса оператора where. where булево_выражение
В этой форме булево_выражение должно давать результат типа bool. Такое вы ражение иначе называется предикатом. В запросе можно указывать несколько операто ров where. В данном примере программы используется следующий оператор where. where n > 0
Этот оператор будет давать истинный результат только для тех элементов массива, значения которых оказываются больше нуля. Выражение n > 0 будет вычисляться для каждого из n элементов массива n при выполнении запроса. В итоге будут по лучены только те значения, которые удовлетворяют этому условию. Иными словами, оператор where выполняет роль своеобразного фильтра, отбирая лишь определенные элементы.