💻 Exemplos: Capítulo 06: LINQ Moderno, Expressões Lambda e Execução Diferida
💻 Exemplos: Capítulo 06: LINQ Moderno, Expressões Lambda e Execução Diferida
Especialização em Sistemas com C# • Demonstrações Práticas Compiláveis
🎯 Objetivo dos Exemplos
Demonstrar a aplicação de LINQ (Language Integrated Query) e expressões lambda funcionais em coleções: compreensão da execução diferida (Deferred Execution / Streaming), encadeamento declarativo de operadores de filtro e projeção (Where, Select, OrderByDescending), agrupamentos estatísticos (GroupBy) e agregações sem alocações transitórias desnecessárias.
1. Código Fonte Completo (Program.cs)
/**
* @file Program.cs
* @brief Consultas LINQ funcionais, deferred execution e agregações em C# 12.
*/
using System;
using System.Collections.Generic;
using System.Linq;
Console.WriteLine("=== CAPÍTULO 06: LINQ MODERNO E EXPRESSÕES LAMBDA ===");
// 1. Modelo de Domínio para Processamento Analítico
public record ServicoTelemetria(string Nome, string Regiao, double LatenciaMs, bool Ativo);
List<ServicoTelemetria> cluster = new()
{
new("Gateway_Alpha", "us-east-1", 12.4, true),
new("Database_Master", "us-east-1", 45.8, true),
new("Auth_Worker", "sa-east-1", 85.2, false), // Inativo
new("Cache_Redis", "sa-east-1", 2.1, true),
new("Edge_Node_01", "eu-west-1", 24.5, true),
new("Edge_Node_02", "eu-west-1", 31.0, true)
};
// 2. Consulta LINQ com Execução Diferida (Deferred Execution)
// A query só é computada quando iterada pelo foreach!
var queryServicosRapidos = cluster
.Where(s => s.Ativo && s.LatenciaMs < 30.0)
.OrderBy(s => s.LatenciaMs);
Console.WriteLine("--- Servicos Ativos com Latencia < 30ms (Ordenados) ---");
foreach (var s in queryServicosRapidos)
{
Console.WriteLine($" {s.Nome,-16} | Regiao: {s.Regiao,-10} | Latencia: {s.LatenciaMs:F1} ms");
}
// 3. Agrupamento (GroupBy) e Cálculo de Média por Região
Console.WriteLine("\n--- Metricas Agrupadas por Regiao (GroupBy) ---");
var estatisticasRegiao = cluster
.Where(s => s.Ativo)
.GroupBy(s => s.Regiao)
.Select(grupo => new
{
Regiao = grupo.Key,
TotalAtivos = grupo.Count(),
LatenciaMedia = grupo.Average(s => s.LatenciaMs),
ServicoMaisRapido = grupo.MinBy(s => s.LatenciaMs)!.Nome
});
foreach (var r in estatisticasRegiao)
{
Console.WriteLine($"Regiao: {r.Regiao}");
Console.WriteLine($" Total Ativos: {r.TotalAtivos}");
Console.WriteLine($" Latencia Media: {r.LatenciaMedia:F2} ms");
Console.WriteLine($" Melhor Servico: {r.ServicoMaisRapido}");
}
// 4. Agregação Funcional com Aggregate (Fold)
double latenciaTotal = cluster
.Where(s => s.Ativo)
.Aggregate(0.0, (acumulador, item) => acumulador + item.LatenciaMs);
Console.WriteLine($"\nLatencia cumulativa de todos os servicos ativos: {latenciaTotal:F1} ms");
2. Instruções de Compilação e Execução
dotnet new console -n AppLinq -f net8.0
cd AppLinq
dotnet run
3. Saída Esperada no Terminal
=== CAPÍTULO 06: LINQ MODERNO E EXPRESSÕES LAMBDA ===
--- Servicos Ativos com Latencia < 30ms (Ordenados) ---
Cache_Redis | Regiao: sa-east-1 | Latencia: 2.1 ms
Gateway_Alpha | Regiao: us-east-1 | Latencia: 12.4 ms
Edge_Node_01 | Regiao: eu-west-1 | Latencia: 24.5 ms
--- Metricas Agrupadas por Regiao (GroupBy) ---
Regiao: us-east-1
Total Ativos: 2
Latencia Media: 29.10 ms
Melhor Servico: Gateway_Alpha
Regiao: sa-east-1
Total Ativos: 1
Latencia Media: 2.10 ms
Melhor Servico: Cache_Redis
Regiao: eu-west-1
Total Ativos: 2
Latencia Media: 27.75 ms
Melhor Servico: Edge_Node_01
Latencia cumulativa de todos os servicos ativos: 115.8 ms