Não consigo mais encontrar o post correto, mas Eric Lippert (e possivelmente vários outros softies) opinaram em várias ocasiões sobre como o Linq é declarativo , que, para várias classes de problemas, é muito mais intuitiva do que a imperativa sintaxe.
Linq permite escrever código que expressa a intenção , não o mecanismo .
Você me diz qual é mais fácil de ler. Isso:
IEnumerable<Customer> GetVipCustomers(IEnumerable<Customer> source)
{
List<Customer> results = new List<Customer>();
foreach (Customer c in source)
{
if (c.FirstName == "Aaron")
{
results.Add(c);
}
}
results.Sort(new LastNameComparer());
return results;
}
class LastNameComparer : IComparer<Customer>
{
public int Compare(Customer a, Customer b)
{
return x.LastName.CompareTo(b.LastName);
}
}
Ou isso?
IEnumerable<Customer> GetVipCustomers(IEnumerable<Customer> source)
{
return from c in source
where c.FirstName == "Aaron"
orderby c.LastName
select c;
}
Ou mesmo isso?
IEnumerable<Customer> GetVipCustomers(IEnumerable<Customer> source)
{
return source.Where(c => c.FirstName == "Aaron").OrderBy(c => c.LastName);
}
O primeiro exemplo é apenas um monte de boilerplate sem sentido, a fim de obter o mais simples dos resultados. Qualquer um que pense que é mais legível do que as versões do Linq precisa ter sua cabeça examinada. Não só isso, mas o primeiro desperdiça memória. Você não pode nem mesmo escrever usando yield return
por causa da classificação.
Seu colega de trabalho pode dizer o que ele quer; Pessoalmente, acho que o Linq melhorou imensamente a legibilidade do código meu .
Também não há nada "relacional" sobre o Linq. Pode ter algumas semelhanças superficiais com o SQL, mas não tenta de nenhuma forma ou forma implementar o cálculo relacional. É apenas um monte de extensões que facilitam a consulta e projetar sequências. "Consulta" não significa "relacional" e, na verdade, existem vários bancos de dados não relacionais que usam a sintaxe semelhante a SQL. Linq é puramente orientado a objeto, apenas trabalha com bancos de dados relacionais através de frameworks como Linq to SQL por causa de alguma árvore de expressões voodoo e design inteligente da equipe C #, tornando funções anônimas implicitamente conversíveis em expressões árvores.