Форум программистов, компьютерный форум, киберфорум
LINQ
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/397: Рейтинг темы: голосов - 397, средняя оценка - 4.54
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342

Описание LINQ

02.01.2010, 17:00. Показов 76445. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
LINQ - Language Integrated Query - Язык Интегрированных Запросов

LINQ — это набор расширений языка, поддерживающий формирование запросов данных с контролем типов
LINQ предоставляет два вида запросов: локальные (для локальных коллекций) и интерпретируемые (для удаленных источников данных)
Базовые единицы данных в LINQ - последовательности.
Последовательность, - любая коллекция, реализующая интерфейс IEnumerable<> или IQueryable<>.
Оператор запроса - метод, преобразующий последовательность.
Запрос - выражение, которое преобразует последовательность с помощью операторов запроса.
Оператор запроса никогда не изменяет входную последовательность, вместо этого он возвращает новую.
Для использования LINQ необходимо подключить пространство имен System.Linq и наличие Framework 3.5 или выше

Синтаксис
LINQ поддерживает два вида синтаксиса: синтаксис запросов и синтаксис методов
Синтаксис запросов:
C#
1
2
3
4
int[] msv = { -1, 2, 3, -4 };
var res = from n in msv
          where n > 0
          select n; // 2, 3
Такой синтаксис всегда должен начинаться с from in и заканчиваться select или group.
Синтаксис методов:
C#
1
2
int[] msv = { -1, 2, 3, -4 };
var res = msv.Where(n => n > 0); // 2, 3
Все стандартные методы реализованы как расширяющие, большинство из них принимает в параметр лямбда-выражение или делегат.
Методы можно применять один за другим:
C#
1
2
int[] msv = { -1, 2, 3, -4, 0, 2, 8, 9, 3 };
var res = msv.Where(n => n > 0 && n % 2 == 0).Select(n => n + 1).Take(3).Sum(); // 15
Оба вида синтаксиса можно использовать вместе:
Выберем из массива строк уникальные строки, содержащие "cyber" и упорядочим их по длинне
C#
1
2
3
4
5
string[] msv = { "cyberforum", "cyberguru", "cyberblogger", "google", "mail", "cyberforum", "cyberguru", };
var res = (from s in msv.Distinct()
           where s.Contains("cyber")
           select s)                   
           .OrderBy(s => s.Length); // cyberguru, cyberforum, cyberblogger
Ключевые слова синтаксиса запросов
from - Указание источника данных и переменной диапазона (аналогично переменной итерации).
where - Фильтрация исходных элементов на основе одного или нескольких логических выражений, разделенных операторами AND и OR ( && или || ).
select - Указание типа и формы, которую будут иметь элементы в возвращенной последовательности при выполнении запроса.
group - Группировка результатов запроса по заданному ключевому значению.
into - Предоставление идентификатора, который может служить ссылкой на результаты предложения join, group или select.
orderby - Сортировка результатов запроса по возрастанию или убыванию в компараторе по умолчанию для типа элемента.
join - Соединение двух источников данных на основе вычисления равенства между двумя заданными парными критериями.
let - Ввод переменной диапазона для хранения результатов вложенного выражения в выражении запроса.
in - Контекстно-зависимое ключевое слово в предложении join.
on - Контекстно-зависимое ключевое слово в предложении join.
equals - Контекстно-зависимое ключевое слово в предложении join.
by - Контекстно-зависимое ключевое слово в предложении group.
ascending - Контекстно-зависимое ключевое слово в предложении orderby.
descending - Контекстно-зависимое ключевое слово в предложении orderby.


Ключевые слова синтаксиса методов
Объединение
Aggregate - Применяет к последовательности пользовательский метод.
Average - Вычисляет среднее для числовой последовательности.
Count - Возвращает количество элементов в последовательности (целочисленное значение).
LongCount - Возвращает количество элементов в последовательности (значение в диапазоне LongInt).
Min - Возвращает наименьшее значение для числовой последовательности.
Max - Возвращает наибольшее значение для числовой последовательности.
Sum - Складывает члены числовой последовательности.

Конкатенация
Concat - Соединяет две последовательности в одну.

Преобразование
Cast - Преобразует элементы последовательности в элемены указанного типа.
OfType - Выбирает из элементов последовательности элемены указанного типа.
ToArray - Возвращает массив из элементов последовательности.
ToDictionary - Возвращает словарь из элементов последовательности.
ToList - Возвращает список из элементов последовательности.
ToLookup - Возвращает результаты поиска по последовательности.
ToSequence - Возвращает последовательность IEnumerable.

Элемент
DefaultIfEmpty - Создает стандартный элемент для пустой последовательности.
ElementAt - Возвращает элемент последовательности по указанному индексу.
ElementAtOrDefault - Возвращает элемент по указанному индексу или стандартный элемент (если индекс вышел за пределы диапазона).
First - Возвращает первый элемент последовательности.
FirstOrDefault - Возвращает первый элемент последовательности или стандартный элемент (если нужный элемент не найден).
Last - Возвращает последний элемент последовательности.
LastOrDefault - Возвращает последний элемент последовательности или стандартный элемент (если нужный элемент не найден).
Single - Возвращает единственный элемент последовательности.
SingleOrDefault - Возвращает единственный элемент последовательности или стандартный элемент (если нужный элемент не найден).

Равенство
SequenceEqual - Проверяет эквивалентность двух последовательностей.

Создание
Empty - Создает пустую последовательность.
Range - Создает последовательность в соответствии с заданным диапазоном.
Repeat - Создает последовательность, повторяя значение заданное количество раз.

Группировка
GroupBy - Группирует элементы последовательности указанным образом.

Присоединение
GroupJoin - Выполняет группированное соединение двух последовательностей.
Join - Выполняет внутреннее соединение двух последовательностей.

Упорядочение
OrderBy - Упорядочивает элементы последовательности по заданным значениям в порядке возрастания.
OrderByDescending - Упорядочивает элементы последовательности по заданным значениям в порядке убывания.
ThenBy - Упорядочивает элементы уже упорядоченной последовательности в порядке возрастания.
ThenByDescending - Упорядочивает элементы уже упорядоченной последовательности в порядке убывания.
Reverse - Зеркально отображает порядок расположения элементов в последовательности.

Разделение на части
Skip - Возвращает последовательность, в которой указанное число элементов пропущено.
SkipWhile - Возвращает последовательность, в которой пропущены элементы, не соответствующие указанному условию.
Take - Возвращает последовательность, в которую включается указанное число элементов.
TakeWhile - Возвращает последовательность, в которую включаются элементы, соответствующие указанному условию.

Проекция
Select - Создает проекцию части последовательности.
SelectMany - Создает проекцию части последовательности по принципу «один ко многим».

Кванторы
All - Определяет соответствие всех элементов последовательности указанным условиям.
Any - Определяет, есть ли в последовательность элементы, удовлетворяющие указанным условиям.
Contains - Определяет, есть ли в последовательности указанный элемент.

Ограничение
Where - Сортирует члены последовательности.

Множества
Distinct - Возвращает последовательность без повторяющихся элементов.
Except - Возвращает последовательность, представляющую собой разность двух других последовательностей.
Intersect - Возвращает последовательность, представляющую собой пересечение двух других последовательностей.
Union - Возвращает последовательность, представляющую собой объединение двух других последовательностей.



Лямбда-выражения
Лямбда-выражения - это специальный синтаксис для сокращённого объявления анонимных методов.
Пример синтаксиса: n => n * n Это выражение принимает один параметр (n) и возвращает n * n.
Пример использования:
C#
1
2
int[] msv = { 1, 2, 3 };
var res = msv.Select(n => n * n); // 1, 4, 9
=> - лямбда оператор, который читается как "переходит в".
Слева от лямбда оператора стоят параметры ввода, справа - выражение
Это лямбда-выражение эквивалентно такому: n => { return n * n; } и такому delegate(int n) { return n * n; }
Стандартные операторы запроса используют обобщенные делегаты Func, например Func<int, bool> соответствует лямбда-выражению int => bool, а Func<string, string, int> - (string, string) => int
Возвращаемое значение Func всегда указывается в качестве последнего аргумента.
В лямбда-выражения можно использовать внешние переменные:
C#
1
2
3
4
int[] msv = { 1, 2, 3 };
int mult = 10;
var res = msv.Select(n => n * mult);
foreach (int i in res) Console.WriteLine(i); // 10, 20, 30

Анонимные типы
Переменные, объявленные внутри метода могут иметь неявный тип var. Локальная переменная с неявным типом имеет строгую типизацию, как если бы тип был задан явно, только тип определяет компилятор.
Например
C#
1
2
3
var person1 = new { Name = "Вася", Age = 19 };
var person2 = new { Name = "Петя", Age = 23 };
var coordinate = new {X = 3.4, Y = 8.0};
При этом person1 и person2 будут иметь одинаковый тип, но отличный от coordinate
Удалить из массива слов все гласные, сохранив при этом оригинальное слово
C#
1
2
3
4
5
6
7
string[] msv = { "cyberforum", "cyberguru", "cyberblogger", "google", "mail" };
var res = msv.Select(s => new
    {
        OriginalWord = s,
        NewWord = Regex.Replace(s, "[aeiouy]", "")
    }).ToArray();
foreach (var i in res) Console.WriteLine(i); // { OriginalWord = cyberforum, NewWord = cbrfrm } ....

Отложенное выполнение
Большая часть операторов запроса выполняется не при конструировании, а только при переборе элементов.
Пример:
C#
1
2
3
4
5
6
int[] msv = { 1, 2, 3 };
int mult = 2;
var res = msv.Select(n => n * mult); // Здесь запрос еще не выполняется
mult = 20;
foreach (int i in res) Console.WriteLine(i); // Он выполняется здесь
// 20, 40, 60
Это называется отложенным или ленивым выполнением, оно характерно для всех операторов запроса, кроме операторов, возвращающих один элемент (First) или значение (Sum), а также для операторов преобразования типа (ToArray, ToList)


Повторное выполнение
Запрос с отложенным выполнение выполняется повторно при повторном переборе элементов
Пример:
C#
1
2
3
4
5
int[] msv = { 1, 2, 3 };
var res = msv.Select(n => n * n);         
foreach (int i in res) Console.WriteLine(i); // 1, 4, 9
msv[2] = 10;
foreach (int i in res) Console.WriteLine(i); // 1, 4, 100
В некоторых ситуациях это нежелательно, избежать этого можно, использовав приведение типа.
C#
1
2
3
4
5
int[] msv = { 1, 2, 3 };
var res = msv.Select(n => n * n).ToArray();
foreach (int i in res) Console.WriteLine(i); // 1, 4, 9
msv[2] = 10;
foreach (int i in res) Console.WriteLine(i); // 1, 4, 9

Расширяющие методы
Поскольку все операторы запроса реализованы ввиде расширяющих методов, можно легко добавить собственные
Несколько примеров расширяющих методов для LINQ
1
Метод, обратный методу Where, возвращает последовательность, элементы которой не удовлетворяют предикату
C#
1
2
3
4
5
6
7
8
public static IEnumerable<TSource> WhereNot<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicat) 
{
    foreach (TSource element in source)
    {
        if (predicat(element) == false)
            yield return element;
    }
}
Использование:
C#
1
2
int[] msv = { 1, 2, 3, 4, 0 };
var res = msv.WhereNot(n => n > 2); // 1, 2, 0
Оператор yield return возвращает один элемент коллекции и перемещает итератор дальше, yield break прекращает итерацию.

2
Метод, возвращающий последовательность от и до определенных индексов
C#
1
2
3
4
5
6
7
8
9
10
public static IEnumerable<TSource> TakeFromTo<TSource>(this IEnumerable<TSource> source, int from, int to)
{
    int iterator = -1;
    foreach (TSource element in source)
    {
        iterator++;
        if (iterator >= from && iterator <= to)
            yield return element;
    }
}
Пример использования:
C#
1
2
int[] msv = { 1, 2, 3, 4, 5, 6 };
var res = msv.TakeFromTo(1, 4); // 2, 3, 4, 5

3
Метод возвращающий индекс предпоследнего элемента
C#
1
2
3
4
5
6
7
8
9
10
11
public static int IndexPenult<TSource>(this IEnumerable<TSource> source, TSource value)
{
    int index = source.Count();
    int temp = 0;
    foreach (TSource element in source.Reverse())
    {
        index--;
        if (element.Equals(value) && temp++ == 1) return index;
    }
    return -1;
}
Пример использования:
C#
1
2
int[] msv = { 1, 2, 3, 3, 2 };
var res = msv.IndexPenult(3); // 2


Несколько примеров запросов LINQ to Objects
Частотный анализ текста
Частотный анализ текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string s = "LINQ is a set of extensions to the .NET Framework that encompass language-integrated query, set, and transform operations. It extends C# and Visual Basic with native language syntax for queries and provides class libraries to take advantage of these capabilities.";
var res = from n in s.ToLower().ToCharArray()
          group n by n into g
          let count = g.Count()
          orderby count descending
          select new
          {
              Letter = g.Key,
              Count = count
          };
foreach (var item in res)
{
    Console.WriteLine(item);
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
out:
{ Letter =  , Count = 39 }
{ Letter = a, Count = 26 }
{ Letter = e, Count = 26 }
{ Letter = t, Count = 22 }
{ Letter = s, Count = 20 }
{ Letter = i, Count = 17 }
{ Letter = n, Count = 17 }
{ Letter = o, Count = 12 }
{ Letter = r, Count = 12 }
{ Letter = l, Count = 7 }
{ Letter = d, Count = 7 }
{ Letter = g, Count = 6 }
{ Letter = f, Count = 5 }
{ Letter = c, Count = 5 }
{ Letter = u, Count = 5 }
{ Letter = h, Count = 4 }
{ Letter = p, Count = 4 }
{ Letter = v, Count = 4 }
{ Letter = q, Count = 3 }
{ Letter = x, Count = 3 }
{ Letter = ., Count = 3 }
{ Letter = m, Count = 3 }
{ Letter = b, Count = 3 }
{ Letter = w, Count = 2 }
{ Letter = k, Count = 2 }
{ Letter = y, Count = 2 }
{ Letter = ,, Count = 2 }
{ Letter = -, Count = 1 }
{ Letter = #, Count = 1 }

Быстрая сортировка
Быстрая сортировка
C#
1
2
3
4
5
6
public static IEnumerable<T> QuickSort<T>(this IEnumerable<T> source) where T : IComparable<T>
{
    if (!source.Any()) return source;
    var first = source.First();
    return source.GroupBy(i => i.CompareTo(first)).OrderBy(g => g.Key).SelectMany(g => g.Key == 0 ? g : QuickSort(g));
}



101 LINQ Samples
LINQ Samples


Позже добавлю про подзапросы, linq to xml и linq to sql
Если где не прав - поправьте, что забыл - добавьте
119
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.01.2010, 17:00
Ответы с готовыми решениями:

Описание переменной LINQ-запроса
Помогите решить проблему. В приложении нужно выполнить LINQ-запрос в зависимости от условия. Как правильно описать CDLPU_Rec перед...

Почему LINQ to Entity содержит не все методы LINQ to Objects?
Почему не все методы linq to entity содержат все методы?Чем например Linq to object

Ускорение Linq to SQL (Compiled Linq, Entity SQL, и т.д.)
Здравствуйте! У меня задание стоит ускорить прогу. В проге во многих местах по куче Linq запросов. Я решил их как-нибудь ускорить. Запросы...

1
23.08.2015, 15:15
 Комментарий модератора 
Если вы нашли неточность или опечатку, хотите что-то добавить к написанному в статье - обсуждение ведётся в отдельной теме: https://www.cyberforum.ru/faq/thread82056.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2015, 15:15
Помогаю со студенческими работами здесь

Linq To Entities - String To Int. "Выражению LINQ to Entities не удается распознать метод "Int32 ."
Прошу помощи высших сил в таком вопросе: У меня есть табличка в базе &quot;План занятий&quot;. В ней есть такие поля: Номер группы, Дата,...

LINQ подтянуть описание по Id
Добрый день. Помогите написать запрос. Надо подтянуть описание статуса по его ID Models class Company { ...

Linq или не Linq. Linq медленней стандартных методов?
Есть у нас два массива, нужно найти совпадения в первом из второго. Два варианта реализации, первый костылем, второй с linq, но скорость...

Литература по EntityFramework, WCF, Linq to Objects, и Linq to SQL
Посоветуйте пожалуйста книги или статьи для освоения следующих вещей: EntityFramework, WCF, Linq to Objects, и Linq to SQL Google...

LINQ to Interbase/Firebird и вообще LINQ to...
Возникла вот надобность работы с СУБД Interbase. Очень хочется пользоваться удобными средствами LINQ. В Сети нашелся ADO.NET provider for...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Закрытая тема Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru