Para qual domínio de problema é feito o LINQ?

12

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?

user1816120
fonte
1
LINQ é para consultar gráficos de objetos. É uma consulta integrada à linguagem - permite consultar e manipular coleções.
Oded
1
provavelmente é uma pergunta que pode ser encerrada, como está, pode haver uma boa pergunta à espreita sobre quais problemas o linq é um bom ajuste para
jk.
1
Linq é declarativo. Você declara "o que" deseja sem especificar "como" isso é feito. Para linq, isso significa que você pode usar uma consulta para indicar o que deseja. O código declarativo pode ser mais curto e fácil de entender para alguns problemas.
precisa saber é o seguinte

Respostas:

16

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,

foreach(var x in list) Console.WriteLine(x);

Para melhorar o uso do LINQ, pratique-o.

Toda vez que você está prestes a escrever uma forou foreachloop 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 foreachversã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 .

jk.
fonte
Talvez eu precise excluir esta pergunta agora. O moderador comentou que não é adequado para a comunidade. Se você sentir o contrário, diga-me.
user1816120
1
Eu acrescentaria que, se você o reescrever no LINQ e o original ainda estiver mais legível, mantenha o original e remova a versão do LINQ. Às vezes, o LINQ simplesmente não adiciona nada.
svick
@ Rick na teoria sim, não tenho certeza se consigo pensar em exemplos disso;)
jk.
1
@jk. Por exemplo, o ReSharper às vezes se oferece para converter meu loop em LINQ usando Aggregate(). Eu acho que na maioria das vezes, o loop é mais legível.
svick
@ Rick provavelmente é uma questão do que você está acostumado, embora eu admita que agregado é um nome desajeitado para fold
jk.
1

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:

Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();

foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
    string extension = Path.GetExtension(file).ToLower();

    if (!fileGroups.ContainsKey(extension))
    {
        fileGroups[extension] = new List<string>();
    }

    fileGroups[extension].Add(file);
}

Considere o equivalente em LINQ:

var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
            group file by Path.GetExtension(file).ToLower();

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:

foreach (var fileGroup in query)
{
    Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));

    foreach (string file in fileGroup)
    {
        Console.WriteLine(file);
    }
}

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.

Daniel B
fonte
Você classifica o mapa ou dobra como "consultas"? Eu realmente não, mas eu acho que eu poderia vê-lo, talvez .. eu normalmente acho que de um agregado, como resultado de um cálculo, e não uma "consulta"
Jimmy Hoffa
@ JimmyHoffa Estou me referindo principalmente à aplicação da computação à coleção subjacente, não necessariamente à computação em si. Mas provavelmente existem buracos na minha analogia, é para ser ilustrativo, e não 100% correto.
Daniel B
@ JimmyHoffa não, mas não tenho certeza se existe uma definição estrita do que uma consulta deve começar
jk.
0

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

Rabbil
fonte
Exatamente o LINQ é uma API de abstração para trabalhar com coleções. Alguns benefícios importantes: usando C #, você fica estático! Verificação de suas consultas e transformações
AndreasScheinert