Шилдт Герберт
Шрифт:
Для обращения к источнику данных по запросу, сформированному средствами LINQ, в этом источнике должен быть реализован интерфейс I Enumerable. Он имеет две формы: обобщенную и необобщенную. Как правило, работать с источником данных легче, если в нем реализуется обобщенная форма IEnumerable<T>, где Т обозначает обобщенный тип перечисляемых данных. Здесь и далее предполагается, что в источнике данных реализуется форма интерфейса IEnumerable<T>. Этот интерфейс объявляется в пространстве имен System. Collections. Generic. Класс, в котором реализуется форма интерфейса IEnumerable<T>, поддерживает перечисление, а это означает, что его содержимое может быть получено по очереди или в определенном порядке. Форма интерфейса IEnumerable<T> поддерживается всеми массивами в С#. Поэтому на примере массивов можно наглядно продемонстрировать основные принципы работы 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. Поэтому рассмотрим его более подробно.
Прежде всего обратите внимание на применение в данном примере программы следующего оператора.
Для применения средств LINQ в исходный текст программы следует включить пространство имен System.Linq.
Затем в программе объявляется массив nums типа int. Все массивы в C# неявным образом преобразуются в форму интерфейса IEnumerable<T>. Благодаря этому любой массив в C# может служить в качестве источника данных, извлекаемых по запросу LINQ.
Далее объявляется запрос, по которому из массива nums извлекаются элементы только с положительными значениями.
var posNums = from n in nums where n > 0 select попеременная posNums называется переменной запроса. В ней хранится ссылка на ряд правил, определяемых в запросе. Обратите внимание на применение ключевого слова var для объявления переменной posNums неявным образом. Как вам должно быть уже известно, благодаря этому переменная posNums становится неявно типизированной. Такими переменными удобно пользоваться в запросах, хотя их тип можно объявить и явным образом (это должна быть одна из форм интерфейса IEnumerable<T>). Объявляемой переменной posNums в итоге присваивается выражение запроса.
Все запросы начинаются с оператора from, определяющего два элемента. Первым из них является переменная диапазона, принимающая элементы из источника данных. В рассматриваемом здесь примере эту роль выполняет переменная п. Вторым элементом является источник данных (в данном случае — массив nums). Тип переменной диапазона выводится из источника данных. Поэтому переменная п относится к типу int. Ниже приведена общая форма оператора from.
from переменная_диапазона in источник_данных
Далее следует оператор where, обозначающий условие, которому должен удовлетворять элемент в источнике данных, чтобы его можно было получить по запросу. Ниже приведена общая форма синтаксиса оператора where.
where булево_выражение