SELECT e projeção
Transforme os dados em novos formatos
SELECT e projeção é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.
O que significa projeção
Select transforma cada elemento de uma sequência em um novo formato. Isso é chamado de projeção.
Ele recebe uma função anônima que mapeia um elemento para um resultado e retorna uma sequência desses resultados, sem alterar a fonte.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
var squares = nums.Select(n => n * n);
Console.WriteLine(string.Join(", ", squares));Alterando o tipo
A projeção pode alterar completamente o tipo dos elementos. Mapear int para string produz um IEnumerable<string>.
O tipo de saída é inferido a partir do tipo de retorno da função anônima, então o compilador o acompanha para você.
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);Projetando propriedades
Um uso frequente é extrair uma única propriedade dos objetos. Select(p => p.Name) transforma uma lista de objetos em uma lista de nomes.
Isso reduz os dados ao necessário antes de um processamento adicional ou da exibição.
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
Você pode projetar em um tipo anônimo para manter vários campos juntos. Use new { ... } dentro da função anônima.
O compilador gera uma classe dinamicamente, com propriedades somente leitura, ideal para dar forma a resultados intermediários.
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 com índice
Assim como Where, Select tem uma sobrecarga que expõe o índice baseado em zero. A função anônima recebe (element, index).
Isso é perfeito para numerar elementos ou associar cada valor à sua posição.
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 na sintaxe de consulta
Na sintaxe de consulta, a cláusula select faz a projeção. Você pode selecionar o próprio elemento ou qualquer expressão baseada nele.
Combine-a com where para filtrar e dar forma aos dados em uma única consulta legível.
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 achata sequências
Quando cada elemento é mapeado para uma coleção, Select produziria uma sequência de sequências. SelectMany achata essas sequências em uma única sequência.
Ele é o equivalente, no LINQ, a um laço aninhado que concatena os 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));A projeção também é adiada
Select segue o modelo de execução adiada. A função anônima de mapeamento só é executada quando a sequência é enumerada.
Assim, criar uma projeção é barato; o trabalho acontece quando você percorre ou materializa o 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 e depois projetar
A ordem é importante para obter clareza e eficiência: filtre primeiro com Where e depois faça a projeção com Select, para transformar somente os elementos que serão mantidos.
Esse fluxo de processamento pode ser lido de cima para baixo e evita trabalho desnecessário de projeção.
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));Projetando para um registro novo
Em vez de tipos anônimos, você pode projetar para um tipo nomeado ou um record. Isso é útil quando os resultados atravessam os limites de um método, pois tipos anônimos não podem ser retornados com um nome conhecido.
Essa também é a forma de criar objetos de transferência de dados a partir de objetos de domínio mais ricos.
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 preserva a ordem e a quantidade
Ao contrário de Where, Select nunca adiciona nem remove elementos — ele faz um mapeamento de um para um. A saída tem a mesma quantidade e a mesma ordem da entrada.
Se precisar de menos elementos, filtre; se precisar de mais elementos a partir de cada um, 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()}");Verificação rápida
Escolha o operador adequado para cada tarefa.
Recapitulação
Select projeta cada elemento em um novo formato — uma propriedade, uma cadeia de caracteres, um tipo anônimo ou um registro — preservando a quantidade e a ordem em uma relação de um para um. Ele tem uma sobrecarga com índice e sua execução é adiada.
SelectMany achata sequências aninhadas. A seguir, classificaremos e agruparemos os dados aos quais demos forma.
Perguntas Frequentes
A aula “SELECT e projeção” é grátis?
Sim — o texto completo de “SELECT e projeção” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.
O que vou aprender em “SELECT e projeção”?
Transforme os dados em novos formatos Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “SELECT e projeção”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- WHERE e filtragem
- SELECT e projeção
- OrderBy e agrupamento
- Agregações e ToList