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