Linq to objects c

LINQ (Language-Integrated Query) представляет простой и удобный язык запросов к источнику данных. В качестве источника данных может выступать объект, реализующий интерфейс IEnumerable (например, стандартные коллекции, массивы), набор данных DataSet, документ XML. Но вне зависимости от типа источника LINQ позволяет применить ко всем один и тот же подход для выборки данных.

Существует несколько разновидностей LINQ:

LINQ to Objects : применяется для работы с массивами и коллекциями

LINQ to Entities : используется при обращении к базам данных через технологию Entity Framework

LINQ to Sql : технология доступа к данным в MS SQL Server

LINQ to XML : применяется при работе с файлами XML

LINQ to DataSet : применяется при работе с объектом DataSet

Parallel LINQ (PLINQ) : используется для выполнения параллельных запросов

В этой главе речь пойдет прежде всего о LINQ to Objects , но в последующих материалах также будут затронуты и другие разновидности LINQ.

В чем же удобство LINQ? Посмотрим на простейшем примере. Выберем из массива строки, начинающиеся на определенную букву и отсортируем полученный список:

Теперь проведем те же действия с помощью LINQ:

Чтобы использовать функциональность LINQ, убедимся, что в файле подключено пространство имен System.LINQ .

Итак, код стал меньше и проще. В принципе все выражение можно было бы записать в одну строку: var selectedTeams = from t in teams where t.ToUpper().StartsWith("Б") orderby t select t . Но для более понятной логической разбивки я поместил каждое отдельное подвыражение на отдельной строке.

Простейшее определение запроса LINQ выглядит следующим образом:

Итак, что делает этот запрос LINQ? Выражение from t in teams проходит по всем элементам массива teams и определяет каждый элемент как t . Используя переменную t мы можем проводить над ней разные операции.

Несмотря на то, что мы не указываем тип переменной t , выражения LINQ являются строго типизированными. То есть среда автоматически распознает, что набор teams состоит из объектов string, поэтому переменная t будет рассматриваться в качестве строки.

Далее с помощью оператора where проводится фильтрация объектов, и если объект соответствует критерию (в данном случае начальная буква должна быть "Б"), то этот объект передается дальше.

Оператор orderby упорядочивает по возрастанию, то есть сортирует выбранные объекты.

Оператор select передает выбранные значения в результирующую выборку, которая возвращается LINQ-выражением.

В данном случае результатом выражения LINQ является объект IEnumerable . Нередко результирующая выборка определяется с помощью ключевого слова var , тогда компилятор на этапе компиляции сам выводит тип.

Преимуществом подобных запросов также является и то, что они интуитивно похожи на запросы языка SQL, хотя и имеют некоторые отличия.

Читайте также:  Ssd диск kingston uv400

Методы расширения LINQ

Кроме стандартного синтаксиса from .. in .. select для создания запроса LINQ мы можем применять специальные методы расширения, которые определены для интерфейса IEnumerable . Как правило, эти методы реализуют ту же функциональность, что и операторы LINQ типа where или orderby .

Запрос teams.Where(t=>t.ToUpper().StartsWith("Б")).OrderBy(t => t) будет аналогичен предыдущему. Он состоит из цепочки методов Where и OrderBy. В качестве аргумента эти методы принимают делегат или лямбда-выражение.

Не каждый метод расширения имеет аналог среди операторов LINQ, но в этом случае можно сочетать оба подхода. Например, используем стандартный синтаксис linq и метод расширения Count(), возвращающий количество элементов в выборке:

Список используемых методов расширения LINQ

Select : определяет проекцию выбранных значений

Where : определяет фильтр выборки

OrderBy : упорядочивает элементы по возрастанию

OrderByDescending : упорядочивает элементы по убыванию

ThenBy : задает дополнительные критерии для упорядочивания элементов возрастанию

ThenByDescending : задает дополнительные критерии для упорядочивания элементов по убыванию

Join : соединяет две коллекции по определенному признаку

GroupBy : группирует элементы по ключу

ToLookup : группирует элементы по ключу, при этом все элементы добавляются в словарь

GroupJoin : выполняет одновременно соединение коллекций и группировку элементов по ключу

Reverse : располагает элементы в обратном порядке

All : определяет, все ли элементы коллекции удовлятворяют определенному условию

Any : определяет, удовлетворяет хотя бы один элемент коллекции определенному условию

Contains : определяет, содержит ли коллекция определенный элемент

Distinct : удаляет дублирующиеся элементы из коллекции

Except : возвращает разность двух коллекцию, то есть те элементы, которые содаются только в одной коллекции

Union : объединяет две однородные коллекции

Intersect : возвращает пересечение двух коллекций, то есть те элементы, которые встречаются в обоих коллекциях

Count : подсчитывает количество элементов коллекции, которые удовлетворяют определенному условию

Sum : подсчитывает сумму числовых значений в коллекции

Average : подсчитывает cреднее значение числовых значений в коллекции

Min : находит минимальное значение

Max : находит максимальное значение

Take : выбирает определенное количество элементов

Skip : пропускает определенное количество элементов

TakeWhile : возвращает цепочку элементов последовательности, до тех пор, пока условие истинно

SkipWhile : пропускает элементы в последовательности, пока они удовлетворяют заданному условию, и затем возвращает оставшиеся элементы

Concat : объединяет две коллекции

Zip : объединяет две коллекции в соответствии с определенным условием

First : выбирает первый элемент коллекции

FirstOrDefault : выбирает первый элемент коллекции или возвращает значение по умолчанию

Single : выбирает единственный элемент коллекции, если коллекция содердит больше или меньше одного элемента, то генерируется исключение

SingleOrDefault : выбирает первый элемент коллекции или возвращает значение по умолчанию

Читайте также:  Ассасин крид истоки у всех на виду

ElementAt : выбирает элемент последовательности по определенному индексу

ElementAtOrDefault : выбирает элемент коллекции по определенному индексу или возвращает значение по умолчанию, если индекс вне допустимого диапазона

Last : выбирает последний элемент коллекции

LastOrDefault : выбирает последний элемент коллекции или возвращает значение по умолчанию

LINQ — LINQ to Objects

В данном разделе описываются сущности, составляющие LINQ. Здесь раскрыта каждая операция, которая может понадобиться. Большая часть эффективности LINQ зависит от знания операций и понимания того, что они делают. Даже если вы не запомните все вариации каждой операции, просто знание об их существовании и о том, что они делают, может здорово помочь.

Представленный обзор LINQ to Objects и стандартных операций запросов позволил удостовериться в мощи и удобстве LINQ, когда речь идет об опросе данных любого типа, которые хранятся в коллекциях, расположенных в памяти. Предлагая около 50 операций, LINQ to Objects без сомнения позволит сделать код опроса данных более согласованным, надежным и легким в написании.

Термин "LINQ to Objects" означает использование запросов LINQ с любой коллекцией IEnumerable или IEnumerable напрямую, без привлечения промежуточного поставщика LINQ, API LINQ to SQL или LINQ to XML. The term "LINQ to Objects" refers to the use of LINQ queries with any IEnumerable or IEnumerable collection directly, without the use of an intermediate LINQ provider or API such as LINQ to SQL or LINQ to XML. Вы можете выполнить запрос LINQ к любой перечислимой коллекции, такой как List , Array или Dictionary . You can use LINQ to query any enumerable collections such as List , Array, or Dictionary . Коллекция может быть определена пользователем или возвращена API .NET Framework. The collection may be user-defined or may be returned by a .NET Framework API.

В общем смысле LINQ to Objects представляет собой новый подход к коллекциям. In a basic sense, LINQ to Objects represents a new approach to collections. Раньше нужно было написать сложные циклы foreach , определяющие порядок извлечения данных из коллекции. In the old way, you had to write complex foreach loops that specified how to retrieve data from a collection. При использовании LINQ пишется декларативный код, описывающий, какие данные необходимо извлечь. In the LINQ approach, you write declarative code that describes what you want to retrieve.

Кроме того, запросы LINQ предлагают три основных преимущества по сравнению с традиционными циклами foreach : In addition, LINQ queries offer three main advantages over traditional foreach loops:

Они более краткие и удобочитаемые, особенно при фильтрации нескольких условий. They are more concise and readable, especially when filtering multiple conditions.

Читайте также:  Девиз кредо по жизни

Они предоставляют широкие возможности фильтрации, упорядочивания и группировки с минимумом кода приложения. They provide powerful filtering, ordering, and grouping capabilities with a minimum of application code.

Они могут переноситься в другие источники данных практически без изменений. They can be ported to other data sources with little or no modification.

В общем, чем сложнее операция, которую нужно выполнить с данными, тем больше преимуществ вы получаете при использовании LINQ вместо традиционных способов итерации. In general, the more complex the operation you want to perform on the data, the more benefit you will realize by using LINQ instead of traditional iteration techniques.

Целью этого раздела является демонстрация подхода LINQ с помощью нескольких примеров. The purpose of this section is to demonstrate the LINQ approach with some select examples. Он не претендует на исчерпывающий характер. It is not intended to be exhaustive.

В этом разделе In This Section

LINQ и строки (C#) LINQ and Strings (C#)
Использование LINQ для запроса и преобразования строк и коллекций строк. Explains how LINQ can be used to query and transform strings and collections of strings. Ссылки на разделы, демонстрирующие эти принципы. Also includes links to topics that demonstrate these principles.

LINQ и отражение (C#) LINQ and Reflection (C#)
Ссылки на пример, демонстрирующий, как LINQ использует отражение. Links to a sample that demonstrates how LINQ uses reflection.

LINQ и каталоги файлов (C#) LINQ and File Directories (C#)
Использование LINQ для взаимодействия с файловыми системами. Explains how LINQ can be used to interact with file systems. Ссылки на разделы, демонстрирующие эти понятия. Also includes links to topics that demonstrate these concepts.

Практическое руководство. Добавление настраиваемых методов для запросов LINQ (C#) How to: Add Custom Methods for LINQ Queries (C#)
Расширение набора методов, которые можно использовать для запросов LINQ путем добавления методов расширения в интерфейс IEnumerable . Explains how to extend the set of methods that you can use for LINQ queries by adding extension methods to the IEnumerable interface.

LINQ (C#) Language-Integrated Query (LINQ) (C#)
Ссылки на разделы, рассказывающие LINQ и содержащие примеры кода выполнения запросов. Provides links to topics that explain LINQ and provide examples of code that perform queries.