LINQ - Você já deve ter ouvido falar disso em algum lugar, foi uma das inovações mais badaladas do .net framework 3.5 e eu tentarei mostrar um pouco do que se trata. Language Integrated Query, ou apenas LINQ, é um componente que adiciona uma linguagem declarativa capaz de realizar consultas sobre as coleções de uma forma bem semelhante ao SQL. Bem, comecei a ler o livro do LINQ In Action e resolvir fazer posts sobre as coisas que tenho aprendido.

Resposta:

Primeiro, vamos falar um pouco sobre delegates. O que são delegates? grosseiramente falando, são ponteiros para função e eles evoluiram bastante desde a primeira versão do .NET framework.

Imaginamos que temos uma lista de nomes e gostaríamos de saber quem tem nome maior que 4 letras.

C#:

List<String> nomes;

nomes = new List<string>();
nomes.Add("Pedro");
nomes.Add("Joao");
nomes.Add("Maria");
nomes.Add("Felipe");
nomes.Add("Marcos");

E temos a nossa função de exibir os nomes que recebe um predicate, que é um método que retorna true ou false baseado na entrada, e exibe os nomes de acordo com o resultado do mesmo.

C#:

static void ExibirNomes(Predicate<String> match)
{
        foreach (string s in nomes)
        {
                if (match(s))
                {
                        Console.WriteLine(s);
                }
        }
}

Na primeira versão do .NET framework, o nosso predicate tinha que ser algo declarado

C#:

bool nomeMaiorQue4(string s)
{
        return s.Length > 4;
}

E chamaríamos a função assim:

C#:

ExibirNomes(nomeMaiorQue4);

Com o .NET framework 2.0, veio os anonymous method, ou seja, agora podemos omitir a declaração

C#:

ExibirNomes(delegate(String s) { return s.Length > 4; });

E agora temos a "evolução" disso, que é o LINQ, claro que o LINQ não é apenas isso, mas é importante entender esse conceito, que é o operador lambda ( => ) pois ele é a base de tudo.

C#:

ExibirNomes(s => s.Length > 4);

Qual a vantagem das Expressões lambdas ao invés dos delegates?

  • Podem inferir o tipo do paramêtro, sendo asism você pode omiti-los.

  • Aceitam tanto bloco de código, bem como expressões, enquanto os delegates aceitam somente bloco de código.

  • Podem participar na inferência do tipo dos argumentos e na resolução dos overloads.

  • As expressões lambdas com expressões podem ser convertidas em árvores de expressões.

Exemplo de expressões Lambdas

  • 01) x => x + 1
  • 02) x => { return x + 1; }
  • 03) (int x) => x + 1
  • 04) (int x) => { return x + 1; }
  • 05) (x, y) => x * y
  • 06) () => 1
  • 07) () => Console.WriteLine()
  • 1 - Tipo implícito com expressão

    2 - Tipo implícito com bloco de código

    3 - Tipo explícito com expressão

    4 - Tipo explícito com bloco de código

    5 - Múltiplos paramêtros

    6 - Sem paramêtros e expressão

    7 - Sem paramêtros e bloco de código

    É isso ai pessoal, nos vemos na próxima lição.

    Endereço de trackback para este post

    Trackback URL (clique direito e copie atalho/localização do link)

    Sem feedback para esse post ainda

    Deixe seu comentário


    Seu endereço de e-mail não será revelado nesse site.

    Sua URL será exibida.
    (Quebras de linha se tornam <br />)
    (Nome, e-mail & website)
    (Permitir que usuários o contatem através de um formulário eletrônico (seu e-mail não será exibido.))