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

«В чём разница между методами LINQ Select и Where?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Методы 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, чтобы избежать ненужных преобразований.