Для чего нужен метод Select в LINQ?

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

Ответ

Select — это метод проекции в LINQ. Он применяет указанную функцию-преобразователь к каждому элементу исходной последовательности и возвращает новую последовательность результатов. Это аналог map в других языках.

Основная цель: Преобразовать (спроецировать) элементы одной коллекции в элементы другого типа или формы.

Базовый пример:

List<int> numbers = new() { 1, 2, 3, 4, 5 };

// Проекция: int -> int (квадрат числа)
IEnumerable<int> squares = numbers.Select(x => x * x);
// Результат: [1, 4, 9, 16, 25]

// Проекция: int -> string (смена типа)
IEnumerable<string> numberStrings = numbers.Select(n => $"Number: {n}");
// Результат: ["Number: 1", "Number: 2", ...]

Использование с анонимными типами (часто в цепочках LINQ):

var users = new List<User> { /* ... */ };

// Проекция в новый объект с нужными полями
var userSummaries = users
    .Where(u => u.IsActive)
    .Select(u => new { u.Id, u.Name, Initial = u.Name[0] }); // Анонимный тип

Перегрузка с индексом элемента:

string[] fruits = { "apple", "banana", "cherry" };
var indexedFruits = fruits.Select((fruit, index) => $"{index}: {fruit}");
// Результат: ["0: apple", "1: banana", "2: cherry"]

Ключевые особенности:

  • Ленивое выполнение: Результат не вычисляется до момента итерации по нему (например, в foreach или ToList()).
  • Не модифицирует исходную коллекцию.
  • Фундаментальный метод для построения цепочек LINQ-запросов, часто используется после Where или перед OrderBy.