Select y proyección
Dé forma a los datos para obtener nuevas estructuras
Select y proyección es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
Qué significa la proyección
Select transforma cada elemento de una secuencia en una forma nueva. Esto se denomina proyección.
Toma una lambda que asigna un elemento a un resultado y devuelve una secuencia con esos resultados, sin modificar el origen.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
var squares = nums.Select(n => n * n);
Console.WriteLine(string.Join(", ", squares));Cambio de tipo
La proyección puede cambiar completamente el tipo de los elementos. Convertir int en string produce un IEnumerable<string>.
El tipo de salida se infiere a partir del tipo de retorno de la lambda, por lo que el compilador lo controla por usted.
using System;
using System.Linq;
int[] nums = { 10, 20, 30 };
var labels = nums.Select(n => $"Item #{n}");
foreach (var l in labels) Console.WriteLine(l);Proyección de propiedades
Un uso frecuente consiste en extraer una sola propiedad de los objetos. Select(p => p.Name) convierte una lista de objetos en una lista de nombres.
Esto reduce los datos a lo que necesita antes de procesarlos o mostrarlos.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var names = users.Select(u => u.Name);
Console.WriteLine(string.Join(", ", names));Resultados de tipo anónimo
Puede proyectar en un tipo anónimo para mantener varios campos juntos. Use new { ... } dentro de la lambda.
El compilador genera una clase sobre la marcha con propiedades de solo lectura, ideal para dar forma a resultados intermedios.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var shaped = users.Select(u => new { u.Name, IsAdult = u.Age >= 18 });
foreach (var s in shaped) Console.WriteLine($"{s.Name}:{s.IsAdult}");Select con índice
Al igual que Where, Select tiene una sobrecarga que expone el índice de base cero. La lambda recibe (element, index).
Esto resulta perfecto para numerar elementos o asociar cada valor con su posición.
using System;
using System.Linq;
string[] tasks = { "Wake", "Eat", "Code" };
var numbered = tasks.Select((t, i) => $"{i + 1}. {t}");
foreach (var n in numbered) Console.WriteLine(n);Select en la sintaxis de consulta
En la sintaxis de consulta, la cláusula select realiza la proyección. Puede seleccionar el propio elemento o cualquier expresión basada en él.
Combínela con where para filtrar y dar forma a los datos en una sola consulta legible.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5 };
var result = from n in nums
where n % 2 == 1
select n * 10;
Console.WriteLine(string.Join(", ", result));SelectMany aplana
Cuando cada elemento se asigna a una colección, Select produciría una secuencia de secuencias. SelectMany aplana esas secuencias en una sola.
Es el equivalente de LINQ a un bucle anidado que concatena los resultados internos.
using System;
using System.Linq;
using System.Collections.Generic;
var groups = new List<int[]> { new[] {1, 2}, new[] {3, 4} };
var flat = groups.SelectMany(g => g);
Console.WriteLine(string.Join(", ", flat));La proyección también es diferida
Select comparte el modelo de ejecución diferida. La lambda de asignación solo se ejecuta cuando se enumera la secuencia.
Por eso, construir una proyección es barato; el trabajo se realiza al iterar o materializar el resultado.
using System;
using System.Linq;
int runs = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Select(n => { runs++; return n; });
Console.WriteLine($"Before: {runs}");
foreach (var _ in q) { }
Console.WriteLine($"After: {runs}");Filtrar y luego proyectar
El orden importa para la claridad y la eficiencia: filtre primero con Where y luego proyecte con Select, de modo que solo transforme los elementos que conserva.
Esta canalización se lee de arriba abajo y evita trabajo de proyección innecesario.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5, 6 };
var result = nums.Where(n => n % 2 == 0)
.Select(n => n * n);
Console.WriteLine(string.Join(", ", result));Proyección en un registro nuevo
En lugar de tipos anónimos, puede proyectar en un tipo con nombre o en un record. Esto resulta útil cuando los resultados atraviesan los límites de un método, ya que los tipos anónimos no pueden devolverse con un nombre conocido.
También es la forma de crear DTO a partir de objetos de dominio más completos.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
record Summary(string Name);
var users = new List<User> { new("Ana", 30) };
var dtos = users.Select(u => new Summary(u.Name));
foreach (var d in dtos) Console.WriteLine(d.Name);Select conserva el orden y la cantidad
A diferencia de Where, Select nunca añade ni elimina elementos: realiza una asignación uno a uno. La salida tiene la misma cantidad y el mismo orden que la entrada.
Si necesita menos elementos, filtre; si necesita obtener más elementos de cada uno, use SelectMany.
using System;
using System.Linq;
int[] nums = { 5, 1, 9 };
var doubled = nums.Select(n => n * 2);
Console.WriteLine($"In:{nums.Length} Out:{doubled.Count()}");Comprobación rápida
Elija el operador adecuado para cada tarea.
Repaso
Select proyecta cada elemento en una forma nueva —una propiedad, una cadena, un tipo anónimo o un registro—, conservando la cantidad y el orden en una relación uno a uno. Tiene una sobrecarga con índice y su ejecución es diferida.
SelectMany aplana secuencias anidadas. A continuación ordenaremos y agruparemos los datos a los que hemos dado forma.
Preguntas frecuentes
¿La lección «Select y proyección» es gratis?
Sí — el texto completo de «Select y proyección» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Select y proyección»?
Dé forma a los datos para obtener nuevas estructuras Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Select y proyección»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Where y filtrado
- Select y proyección
- OrderBy y agrupación
- Agregados y ToList