В чём разница между методами LINQ Select и Where?

Ответ

Методы Select и Where в LINQ выполняют принципиально разные операции над последовательностями (коллекциями).

Where — фильтрация

  • Назначение: Фильтрует исходную коллекцию, возвращая новую последовательность, содержащую только те элементы, которые удовлетворяют заданному условию (предикату).
  • Результат: Количество элементов в результирующей последовательности меньше или равно исходному. Тип элементов не меняется.
var numbers = new List<int> { 1, 2, 3, 4, 5 };

// Отфильтровать только чётные числа
var evenNumbers = numbers.Where(n => n % 2 == 0); // Результат: [2, 4]
// Тип evenNumbers: IEnumerable<int>

Select — проекция

  • Назначение: Преобразует (проецирует) каждый элемент исходной коллекции в новую форму по заданному правилу.
  • Результат: Количество элементов в результирующей последовательности равно исходному. Тип элементов может измениться.
// Преобразовать числа в их строковое представление
var numberStrings = numbers.Select(n => n.ToString()); // Результат: ["1", "2", "3", "4", "5"]
// Тип numberStrings: IEnumerable<string>

// Преобразовать числа в объекты
var numberObjects = numbers.Select(n => new { Value = n, IsEven = n % 2 == 0 });
// Результат: анонимные объекты {Value=1, IsEven=false}, ...

Комбинирование методов

Методы LINQ можно и нужно объединять в цепочки для построения сложных запросов. Порядок важен для производительности.

var result = numbers
    .Where(n => n > 2)          // Сначала фильтруем: [3, 4, 5]
    .Select(n => n * 10)        // Затем преобразуем: [30, 40, 50]
    .ToList();

// Эффективнее: фильтрация сокращает количество элементов ДО преобразования.

Итог: Where — для отбора элементов, Select — для изменения формы элементов. Используйте Where перед Select, чтобы избежать ненужных преобразований.

Ответ 18+ 🔞

А, ну это же классика, про которую постоянно путаются, особенно новички! Смотри, объясню на пальцах, без этой охуевшей казёнщины.

Представь, что у тебя есть мешок с картошкой. Вот прям целый мешок.

Where — это когда ты перебираешь эту картоху и говоришь: «А ну-ка, выкину всю гнилую и мелкую, оставлю только крупную и целую».
Фильтрация, отбор. Мешок после этого стал легче, но внутри всё ещё картошка.
numbers.Where(n => n > 10) — оставил только числа больше десяти. Их меньше, но они всё ещё числа.

Select — это уже другая операция. Ты берёшь каждую картофелину и делаешь из неё что-то другое. Чистишь и режешь на ломтики для фри. Или вообще делаешь из неё пюре в миске.
Проекция, преобразование. Количество «штук» осталось тем же (на каждую картошину — своя порция пюре), но тип поменялся. Картошки уже нет, есть пюре.
numbers.Select(n => n.ToString()) — каждое число превратил в строку. Их столько же, но теперь это текст, а не цифры.

А теперь самое вкусное — комбинация, где многие ебут мозг.

Допустим, тебе нужно из мешка взять только крупную картошку, почистить её и нарезать соломкой.
Как делать-то, гений?
Вариант «в лоб» (плохой):

  1. Всю картоху, включая гнилую и мелкую, почистил и нарезал (Select).
  2. Потом начал из этой кучи нарезки выковыривать и выкидывать кусочки от гнилой картохи (Where).
    Зачем, блядь, чистил и резал то, что всё равно выбросишь? Силы и время на ветер.

Правильно (как умный человек):

  1. Сначала засунул руку в мешок и выбрал только крупную и целую картоху (Where). Всё ненужное сразу в помойку.
  2. Потом только эту отборную картоху почистил и нарезал (Select).
    Экономия, эффективность, красота.

На коде это выглядит так:

var numbers = new List<int> { 5, 12, 3, 20, 1, 8 };

// Правильная цепочка: сначала отбор, потом преобразование
var result = numbers
    .Where(n => n > 10)       // Отфильтровали: осталось [12, 20]
    .Select(n => n * 100)     // Преобразовали: получили [1200, 2000]
    .ToList();

// И не наоборот, а то будешь как лох преобразовывать единицу и тройку впустую.

Короче, итог:
Where«оставить вот это, а это выкинуть». Меньше элементов, тип тот же.
Select«взять каждый элемент и сделать из него другую хуйню». Столько же элементов, но тип может быть другим.
А соединять их надо с мозгом: сначала отсеивай мусор (Where), а потом уже работай с тем, что осталось (Select). Всё просто, как три копейки.