0Pricing
C# Academy · Aula

Dicas de composição

Mantenha o LINQ combinável: use predicados e transformações puros e pequenos, componha delegados, adicione pequenos auxiliares de extensão e retorne esteiras de IEnumerable .

Dicas de composição é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 3 de 3. 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 3 aulas no total.

Visão geral do LINQ componível

Objetivo: tornar o LINQ fácil de expandir.

  • Escreva predicados/transformações pequenos e puros
  • Componha funções (sem efeitos secundários)
  • Adicione pequenos métodos auxiliares de extensão
  • Devolva fluxos de IEnumerable<T>

Reutilização de auxiliares puros

Extraia métodos puros pequenos e passe-os como grupos de métodos. A reutilização mantém os fluxos curtos e fáceis de ler.

using System;
using System.Linq;

public class Program
{
  static bool IsEven(int n) { return n % 2 == 0; }   // pure predicate
  static int Square(int n) { return n * n; }         // pure transform

  public static void Main(string[] args)
  {
    int[] xs = new int[] { 1, 2, 3, 4, 5, 6 };

    var q = xs
      .Where(IsEven)     // reuse predicate
      .Select(Square);   // reuse transform

    foreach (int v in q) Console.WriteLine(v); // 4 16 36
  }
}

Composição de predicados

Crie novos predicados compondo predicados menores. Assim, a lógica mantém-se testável e reutilizável.

using System;
using System.Linq;

public class Program
{
  // Return a predicate n > threshold
  static Func<int, bool> GreaterThan(int threshold)
  {
    return delegate(int n) { return n > threshold; };
  }

  // Combine two predicates with AND
  static Func<int, bool> And(Func<int, bool> a, Func<int, bool> b)
  {
    return delegate(int n) { return a(n) && b(n); };
  }

  static bool IsEven(int n) { return n % 2 == 0; }

  public static void Main(string[] args)
  {
    int[] xs = new int[] { 1, 2, 3, 4, 5, 6 };

    Func<int, bool> gt2 = GreaterThan(2);
    Func<int, bool> evenAndGt2 = And(IsEven, gt2);

    var q = xs.Where(evenAndGt2); // even and > 2 => 4,6

    foreach (int v in q) Console.WriteLine(v);
  }
}

Extensões claras

Adicione uma pequena extensão para expressar a intenção, por exemplo, WhereNot. Mantenha-a simples e sem efeitos secundários.

using System;
using System.Collections.Generic;
using System.Linq;

public static class LinqEx
{
  public static IEnumerable<T> WhereNot<T>(this IEnumerable<T> src, Func<T, bool> predicate)
  {
    foreach (T item in src)
    {
      if (!predicate(item)) yield return item;
    }
  }
}

public class Program
{
  static bool IsVowel(char c)
  {
    char x = Char.ToLower(c);
    return x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u';
  }

  public static void Main(string[] args)
  {
    char[] letters = new char[] { 'a', 'b', 'c', 'e', 'i' };

    var consonants = letters.WhereNot(IsVowel);

    foreach (char c in consonants) Console.WriteLine(c); // b, c
  }
}

Auxiliares de fluxo reutilizáveis

Exponha auxiliares reutilizáveis de IEnumerable<T>. Os chamadores podem continuar a compor a cadeia (OrderBy, Take etc.).

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
  static bool IsEven(int n) { return n % 2 == 0; }
  static int Square(int n) { return n * n; }

  // Reusable pipeline helper: filter evens and square
  public static IEnumerable<int> SquaresOfEvens(IEnumerable<int> xs)
  {
    foreach (int x in xs)
    {
      if (IsEven(x)) yield return Square(x);
    }
  }

  public static void Main(string[] args)
  {
    int[] data = new int[] { 1, 2, 3, 4, 5, 6 };

    var pipeline = SquaresOfEvens(data); // composable
    var topTwo = pipeline.OrderByDescending(x => x).Take(2);

    foreach (int v in topTwo) Console.WriteLine(v); // 36, 16
  }
}

Lista de verificação da composição

Dicas:

  • Prefira auxiliares puros; evite efeitos secundários dentro de Select/Where.
  • Componha predicados e transformações; atribua-lhes bons nomes.
  • Devolva IEnumerable<T> a partir dos auxiliares para que os chamadores possam estender a cadeia.
  • Materialize tarde; evite ToList no meio, salvo se necessário.

Melhor prática para a composição

Verificação rápida: que prática mantém melhor os fluxos do LINQ componíveis e testáveis?

Recapitulação

Recapitulação: extraia pequenos auxiliares puros, componha predicados, adicione pequenas extensões e devolva fluxos para que os chamadores possam continuar a encadear operações.

Perguntas Frequentes

A aula “Dicas de composição” é grátis?

Sim — o texto completo de “Dicas de composiçã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 3 aulas no total.

O que vou aprender em “Dicas de composição”?

Mantenha o LINQ combinável: use predicados e transformações puros e pequenos, componha delegados, adicione pequenos auxiliares de extensão e retorne esteiras de IEnumerable . 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 3 de 3.

Quanto tempo leva a aula “Dicas de composiçã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

  1. GroupBy, Join, Aggregate, projeções (tipos anônimos)
  2. Materialização (ToList, ToDictionary) e observações de desempenho
  3. Dicas de composição
← Voltar para C# Academy