Что такое LINQ в C# и с чего начать? Запутался в Where и Select
Постоянно слышу про 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 ответа
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 ленивый, об этом отдельная тема).
Для наглядности — тот же запрос в запросном (query) синтаксисе, чтобы ты узнавал его в чужом коде:
var result = (from n in nums
where n > 3
select n * 10).ToList();
Результат идентичен. Лично я почти всегда пишу методный синтаксис, query-синтаксис удобен разве что для сложных join и group by. Начинай с Where/Select — это 80% всех задач.