C# Coleções Intermediário
LINQ
LINQ (Language Integrated Query) é um conjunto de recursos do C# que permite consultar coleções de forma declarativa e fortemente tipada. Com LINQ, você escreve consultas parecidas com SQL diretamente no código, usando métodos de extensão como Where, Select, OrderBy e GroupBy.
A grande vantagem é a execução adiada: a consulta só é executada quando você itera sobre o resultado (por exemplo, com foreach ou chamando ToList()). Isso permite compor consultas complexas de forma eficiente e legível.
Além da sintaxe de métodos, o C# oferece a sintaxe de consulta (query syntax), que usa palavras-chave como from, where, select, orderby e group. Ambas são equivalentes e podem ser combinadas.
Neste card, você vai aprender a filtrar, projetar, ordenar, agrupar e entender quando a consulta é realmente executada.
Pontos-chave
Wherefiltra elementos;Selecttransforma cada elemento;OrderBy/ThenByordenam a sequência.GroupByagrupa elementos por uma chave e retorna uma sequência de grupos (IGrouping<TKey, TElement>).- A sintaxe de consulta (
from ... where ... select) é traduzida para chamadas de método pelo compilador. - LINQ usa execução adiada: a consulta só roda quando você itera sobre ela ou chama um operador de agregação.
- Métodos como
ToList(),ToArray(),Count()eFirst()forçam a execução imediata.
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
var produtos = new List<Produto>
{
new Produto { Nome = "Teclado", Categoria = "Informática", Preco = 120.0m },
new Produto { Nome = "Mouse", Categoria = "Informática", Preco = 80.0m },
new Produto { Nome = "Cadeira", Categoria = "Móveis", Preco = 450.0m },
new Produto { Nome = "Mesa", Categoria = "Móveis", Preco = 800.0m },
new Produto { Nome = "Monitor", Categoria = "Informática", Preco = 900.0m }
};
// Consulta com sintaxe de método: filtra, ordena e projeta
var caros = produtos
.Where(p => p.Preco > 100)
.OrderBy(p => p.Preco)
.Select(p => $"{p.Nome} - R$ {p.Preco:F2}");
Console.WriteLine("Produtos acima de R$ 100 (ordenados por preço):");
foreach (var item in caros)
Console.WriteLine(item);
// Agrupamento por categoria com sintaxe de consulta
var porCategoria = from p in produtos
group p by p.Categoria into g
select new { Categoria = g.Key, Total = g.Count(), Media = g.Average(p => p.Preco) };
Console.WriteLine("\nResumo por categoria:");
foreach (var grupo in porCategoria)
Console.WriteLine($"{grupo.Categoria}: {grupo.Total} itens, média R$ {grupo.Media:F2}");
// Execução adiada: a consulta só roda no foreach
var consulta = produtos.Where(p => p.Preco > 500);
produtos.Add(new Produto { Nome = "Notebook", Categoria = "Informática", Preco = 3500.0m });
Console.WriteLine("\nProdutos acima de R$ 500 (inclui novo item):");
foreach (var p in consulta)
Console.WriteLine(p.Nome);
}
}
class Produto
{
public string Nome { get; set; }
public string Categoria { get; set; }
public decimal Preco { get; set; }
}