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

Описание LINQ

02.01.2010, 17:00. Показов 76316. Ответов 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
Закрытая тема Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru