Щоб відповісти на відредаговане запитання: коротше кажучи, корисно використовувати LINQ, коли вам доведеться реалізувати функцію "запиту" (саме для цього і відповідає Q у LINQ). Визначити точний домен складно, але це значно спрощує різноманітні завдання, пов’язані з вилученням та маніпулюванням даними з колекцій.
Щоб трохи уточнити, багато функцій запитів було передано безпосередньо мовою (а точніше, різними LINQ-реалізаторами), тому такі речі, як агрегація, упорядкування, групування, фільтрація, проекції, з'єднання (та багато іншого), обробляються ви. Рішення на основі LINQ, як правило, набагато коротші, ніж якби ви їх реалізували "вручну", а також повідомляли про їх наміри набагато краще.
Простий приклад, який часто допомагає передати потужність LINQ - це відображення вмісту каталогу, згрупованого за розширенням. Пробіжіть типову імперативну реалізацію в голові - буде багато деталей щодо впровадження вже на самому початку. Можливо, ми будемо використовувати a Dictionary<String, List<String>>
для індексації файлів за розширенням. Звичайно, нам доведеться перевірити, чи ключ вже існує, інстанціювати список, додати до нього тощо. Це може мати щось на зразок:
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);
}
Розглянемо еквівалент LINQ:
var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
group file by Path.GetExtension(file).ToLower();
Зауважте, що сам запит - це лише 2 рядки, звичайно коротший, ніж будь-яке імперативне рішення, яке ми могли б придумати. Це також досить читабельно; співвідношення сигнал / шум вище, ніж було у першого рішення. Для тих, хто не є новим для LINQ, результати цього запиту слід виводити так:
foreach (var fileGroup in query)
{
Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));
foreach (string file in fileGroup)
{
Console.WriteLine(file);
}
}
При більш складних прикладах відмінності зазвичай стають ще більші (наприклад, просто розгляньте групування за кількома полями). Отже, підсумовуючи, LINQ вирішує багато "щоденних" проблем із запитом даних таким чином, який часто є коротшим та самоописовішим. Це пов'язано з невеликою ціною, коли потрібно вивчити синтаксис та технологію, але переваги значно переважають негативи.