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.