Cada vez que vejo uma pergunta postada no Stack Overflow em C #, vejo pelo menos uma ou duas respostas postadas que resolvem um problema com o LINQ. Normalmente, pessoas com reputação muito alta parecem usar o LINQ como profissionais.
Então, minha pergunta é: para qual domínio de problema o LINQ deve ser usado?
Também nas notas laterais: existe algum objetivo em que deve ser evitado? O tamanho do conjunto de dados afeta o desempenho das consultas LINQ?
c#
linq
professional-development
user1816120
fonte
fonte
Respostas:
O LINQ foi projetado principalmente para permitir consultas funcionais puras e transformações nas seqüências de dados (você notará que todas as extensões LINQ recebem delegados do Func, mas não delegados de Ação). Consequentemente, o caso mais comum de um loop que não se encaixa muito bem com o LINQ é sobre efeitos colaterais funcionais não puros, por exemplo,
Para melhorar o uso do LINQ, pratique-o.
Toda vez que você está prestes a escrever uma
for
ouforeach
loop para fazer algo com uma coleção, parada, considere se é um bom ajuste para LINQ (ou seja, ele não está apenas realizando um efeito de ação / lateral sobre os elementos), e se assim se forçar a gravação usando LINQ.Você também pode escrever a
foreach
versão primeiro e depois reescrever para uma versão LINQ.Como svick aponta, o LINQ deve tornar seu programa mais legível. Geralmente é bom nisso, pois tende a enfatizar a intenção do código e não o mecanismo; no entanto, se você achar que não pode tornar suas consultas mais legíveis que um loop simples, fique à vontade para continuar com o loop.
Se você precisar de exercícios para praticar, a maioria dos exercícios de programação funcional será bem mapeada para o LINQ, por exemplo, 99 problemas (especialmente os primeiros 20 ou mais) ou o projeto euler .
fonte
Aggregate()
. Eu acho que na maioria das vezes, o loop é mais legível.Para responder à pergunta editada: em resumo, é benéfico usar o LINQ sempre que você precisar implementar a funcionalidade "consulta" (é isso que o Q no LINQ significa). Definir um domínio exato é difícil, mas simplifica bastante uma variedade de tarefas associadas à extração e manipulação de dados de coleções.
Para elaborar um pouco, muitas funcionalidades de consulta foram trazidas diretamente para a linguagem (ou melhor, para os vários implementadores de LINQ); portanto, coisas como agregações, pedidos, agrupamentos, filtros, projeções, junções (e muito mais) são tratadas para você. As soluções baseadas em LINQ também são geralmente muito mais curtas do que se você as implementasse "manualmente" e também comunicam suas intenções muito melhor.
Um exemplo simples que geralmente ajuda a transmitir o poder do LINQ é exibir o conteúdo de um diretório, agrupado por extensão. Execute uma implementação imperativa típica em sua cabeça - já haverá muitos detalhes de implementação desde o início. Talvez possamos usar a
Dictionary<String, List<String>>
para indexar os arquivos por extensão. Obviamente, teremos que verificar se uma chave já existe, instanciar uma lista, adicioná-la etc. Isso pode ser algo como:Considere o equivalente em LINQ:
Observe que a consulta em si é de apenas 2 linhas, certamente menor do que qualquer solução imperativa que possamos ter encontrado. Também é bastante legível; a relação sinal / ruído é mais alta do que era na primeira solução. Para aqueles que são novos no LINQ, você produziria os resultados dessa consulta da seguinte maneira:
Com exemplos mais complexos, as diferenças normalmente se tornam ainda mais vastas (considere simplesmente agrupar por vários campos, por exemplo). Portanto, para resumir, o LINQ resolve muitos problemas do dia a dia consultando dados de uma maneira que geralmente é mais curta e mais auto-descritiva. Isso tem um custo moderado de ter que aprender a sintaxe e a tecnologia, mas os benefícios superam os negativos.
fonte
Diferentes idiomas foram desenvolvidos ao longo do tempo para os vários tipos de fontes de dados, por exemplo, SQL para bancos de dados relacionais e XQuery para XML. Portanto, os desenvolvedores tiveram que aprender uma nova linguagem de consulta para cada tipo de fonte ou formato de dados que eles devem suportar. O LINQ simplifica essa situação, oferecendo um modelo consistente para trabalhar com dados em vários tipos de fontes e formatos de dados. Em uma consulta LINQ, você está sempre trabalhando com objetos. para mais informações, visite http://msdn.microsoft.com/en-us/library/bb397906.aspx
fonte