💻 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