LINQ и лямбда-выражения
<< Click to Display Table of Contents >> LINQ и лямбда-выражения |
LINQ (Language-Integrated Query) – универсальный язык запросов для каждого типа источника данных. В качестве источника данных может выступать объект, реализующий интерфейс IEnumerable (стандартные коллекции, массивы и т.д.), набор данных DataSet, документ XML. Вне зависимости от типа источника LINQ позволяет применить ко всем один и тот же подход для выборки данных. Таким образом, при использовании LINQ разработчикам не приходится учить новый язык источника данных или формата данных, для которых требуется обеспечить поддержку.
Рассмотрим простой пример выборки из массива строк, которые начинаются на определенную букву – например, на «С».
Пример 1. Выборка с использованием оператора foreach
string[] cities = { "Москва", "Кострома", "Иркутск", "Сургут", "Сочи"};
// List<T> - наследник IEnumerable<T>.
var selectedCities = new List<string>();
foreach (string c in cities)
{
if (c.ToUpper().StartsWith("С"))
selectedCities.Add(c);
}
Тот же пример можно реализовать с помощью LINQ.
Пример 2. Использование LINQ
string[] cities = { "Москва", "Кострома", "Иркутск", "Сургут", "Сочи"};
IEnumerable<string> selectedCities =
// Определить каждый объект как «с».
from c in cities
// Отфильтровать по критерию.
where c.ToUpper().StartsWith("С")
// Выбрать объект.
select c;
LINQ преобразует запросы в удобную языковую конструкцию, которая применяется аналогично методам, классам и событиям.
Методы расширения LINQ
Для создания запроса LINQ, кроме стандартного синтаксиса from in select, можно использовать специальные методы расширения, которые определены для интерфейса IEnumerable. Например:
•Any – проверяет существование хотя бы одного элемента в последовательности;
•First – возвращает первый элемент последовательности;
•FirstOrDefault – возвращает первый элемент последовательности или значение по умолчанию, если ни одного элемента не найдено;
•OrderBy – сортировка элементов в порядке возрастания;
•Select – определяет тип значений, которые будут получены при выполнении запроса;
•Single – возвращает единственный конкретный элемент последовательности;
•SingleOrDefault – возвращает единственный конкретный элемент последовательности или значение по умолчанию, если этот элемент не найден. Генерирует исключение, если в последовательности содержится более одного элемента;
•Take – возвращает указанное число подряд идущих элементов с начала последовательности;
•ToList – создает объект List<T> из IEnumerable<T>;
•Where – определяет фильтр элементов источника на основе одного или нескольких логических выражений, разделенных операторами логического И и ИЛИ (&& или ||).
Как правило, эти методы реализуют ту же функциональность, что и операторы LINQ типа where. Подробнее о том, какие методы расширения System.Linq доступны для использования, см. в разделе «Методы расширения System.Linq».
При написании LINQ-запросов рекомендуется использовать лямбда-выражения.
Лямбда-выражение – это блок кода (выражение или оператор кода), который рассматривается как объект. Лямбда-выражения можно передавать в качестве аргументов или возвращать в качестве значений из вызовов функций. Для объявления лямбда-выражения используется оператор =>. Например, используются конструкции:
.Where(p => p != null)
.Where(p => Function(p))
.Select(p => p.Name)
.Take(10)
.OrderBy(p => p.Date)
Рассмотрим пример запроса, использующего метод расширения. Он эквивалентен двум примерам выше. В качестве аргумента метод принимает лямбда-выражение.
Пример 3. Использование лямбда-выражений
string[] cities = { "Москва", "Кострома", "Иркутск", "Сургут", "Сочи"};
IEnumerable<string> selectedCities = cities.Where(c => c.ToUpper().StartsWith("С"));
Чтобы создать лямбда-выражение, необходимо указать входные параметры, если они есть, с левой стороны оператора =>, и поместить блок выражений или операторов с другой стороны. Например, лямбда-выражение x => 2*x задает параметр с именем x и возвращает значение 2 умноженное на x. Оператор => имеет такой же приоритет, как и присваивание (=). При написании лямбда-выражений обычно не требуется указывать тип входных параметров.
Подробнее о лямбда-выражениях см. в документации Microsoft статью «Лямбда-выражения (Руководство по программированию в C#)».
© Компания Directum, 2024 |