Введение в LINQ, на примере C#

Введение в LINQ, на примере C#

Друзья, сегодня хотелось бы поделиться с замечательной вещью под названием LINQ. Кто хоть немного знаком с C# или Visual Basic.NET не раз слышал о LINQ, кого-то эта штука пугает, кто-то не понимает, кто-то совсем не слышал, а зря.

Немного теории о LINQ.

Итак, LINQ (Language Integrated Query ) имеет SQL-подобный синтаксис и облегчает работу с различными коллекциями (массивы, списки и т.д, называется это LINQ to Objects), кроме того предлагаются различные API-интерфейсы для запросов к XML документам, к базам данных и т.п. Мы рассмотрим только LINQ to Objects.

Перед тем как пойдем дальше разберемся с понятием «запрос». Запрос – некое выражение, которое извлекает данные из источника этих данных (Например, выбор четных чисел из массива. Данные – четные числа, источник данных – массив). Это выражение описывается на специальном языке запросов, в нашем случае – LINQ.

Как составить LINQ запрос?

Почти все запросы в LINQ состоят из трех частей:

    1. Получаем источник данных
    2. Создаем наш запрос
    3. Выполняем запрос

Чтобы было понятно рассмотрим пример, в котором все эти три части реализуются :

Сама переменная запроса queryNumbers, в примере выше, лишь хранит команды запроса. По сути, само выполнение запроса всегда откладывается до выполнения итерации переменной запроса (в нашем случае - itemNumber) в foreach. Именно поэтому комментарий «3.Выполнение запроса…» стоит над foreach. Такую концепцию называют отложенным выполнением.

Ближе к LINQ запросу.

Рассмотри операции from, where, select, join и т.п. Для составления грамотного, а главное правильного запроса, необходимо придерживаться следующих правил:

1. Выражение в LINQ должно начинаться с простой конструкции from - некий генератор, который объявляет переменную диапазона, в нашем случае number, которая перечисляет последовательность

2. Следующая часть может содержать в себе конструкцию where, которая каким-то образом фильтрует данные из источника данных, в нашем случае (number % 2) == 0

3. Далее часть запроса может включать в себя конструкцию orderby, которая содержит поле сортировки с направлением упорядочивания. Направлением может быть, например, по возрастанию или по убыванию.

4. В оставшейся части запроса может идти конструкция group или, как у нас, select - лишь задает тип значений, которые получены при выполнении нашего запроса.

5. Так же в конце может быть использована конструкция join – аналогично с SQL, позволяет связывать элементы из различных последовательностей.

Ключевое слово var в C#

С некоторого времени в C# переменные получили возможность иметь неявный тип var. Что очень облегчает работу с тем же LINQ, в примере выше мы писали

Для чего? Во-первых, не нужно задумываться о типе, во-вторых, ускоряет написание кода, иногда упрощает чтение, иногда наоборот. В данном случае, использовать var можно, но не обязательно, т.к тип результата запроса можно задать явно - IEnumerable, однако бывают моменты, когда использовать var необходимо, например, когда результатом запроса является коллекция анонимных типов.

Зачем нужен LINQ?

Итак, что нам дает LINQ– красивый и понятный код, огромные возможности для работы с коллекциями, XML документами и базами данных. Так же очень сильно упрощает код совместное использование лямбда выражений, чтобы было понятно, перепишем наш пример:

Рассмотрим строчку

Во всех лямбда-выражениях используется лямбда-оператор =>, этот оператор разделяет наше лямбда-выражение на две части. Так, в левой части находится входной параметр, а в правой части - тело лямбда-выражения.

LINQ достаточно гибок, особенно в связке с лямбда выражениям. Для более подробного изучения LINQ to Object советую посетить данный ресурс