Ответ
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.