← Все вопросы

Что такое LINQ в C# и с чего начать? Запутался в Where и Select

Задан 1 месяц назад518 просмотров2 ответа
11

Постоянно слышу про LINQ, вижу его в каждом втором примере на C#, но так и не понял, что это и зачем. Это какая-то библиотека? Отдельный язык? И почему пишут то from x in ..., то .Where(...)?

Хочу из списка чисел оставить только большие тройки и умножить их на 10. Сейчас делаю циклом:

var nums = new List<int> { 1, 5, 2, 8, 3, 9 };
var result = new List<int>();
foreach (var n in nums)
{
    if (n > 3)
        result.Add(n * 10);
}

Говорят, через LINQ это пишется в одну строку. Как? И в чём смысл Where и Select?

2 ответа

16
✓ Принятый ответ — помог автору

LINQ (Language Integrated Query) — это набор методов-расширений для работы с коллекциями: фильтрация, преобразование, сортировка, группировка. Не отдельный язык и не внешняя библиотека, он встроен в C# (нужен using System.Linq;).

Два самых базовых метода:

  • Where — фильтрует, оставляет элементы, для которых условие истинно.
  • Select — преобразует каждый элемент (проекция).

Твой цикл один в один переписывается так:

using System.Linq;

var nums = new List<int> { 1, 5, 2, 8, 3, 9 };

var result = nums
    .Where(n => n > 3)    // оставить большие 3
    .Select(n => n * 10)  // умножить на 10
    .ToList();

// result: 50, 80, 90

Про два синтаксиса: есть методный (.Where().Select()) и запросный (from n in nums where n > 3 select n * 10). Они эквивалентны, компилятор переводит запросный в методный. Большинство пишут методный — он привычнее и читается как цепочка. ToList() в конце нужен, чтобы получить готовый список (без него LINQ ленивый, об этом отдельная тема).

4

Для наглядности — тот же запрос в запросном (query) синтаксисе, чтобы ты узнавал его в чужом коде:

var result = (from n in nums
              where n > 3
              select n * 10).ToList();

Результат идентичен. Лично я почти всегда пишу методный синтаксис, query-синтаксис удобен разве что для сложных join и group by. Начинай с Where/Select — это 80% всех задач.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект