Чтобы ответить на отредактированный вопрос: короче говоря, полезно использовать LINQ всякий раз, когда вам нужно реализовать функцию «запроса» (это то, что обозначает Q в LINQ). Определить точный домен сложно, но он значительно упрощает различные задачи, связанные с извлечением данных из коллекций и манипулированием ими.
Чтобы уточнить, многие функции запросов были перенесены непосредственно в язык (точнее, в различные LINQ-разработчики), поэтому такие вещи, как агрегация, упорядочение, группировка, фильтрация, проекции, объединения (и многие другие), все обрабатываются для вы. Решения на основе LINQ, как правило, также намного короче, чем если бы вы реализовывали их «вручную», а также гораздо лучше сообщают о своих намерениях.
Простой пример, который часто помогает передать всю мощь LINQ, - это отображение содержимого каталога, сгруппированного по расширению. Выполните типичную императивную реализацию в своей голове - там будет много деталей реализации уже с самого начала. Возможно, мы будем использовать 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 решает многие «повседневные» проблемы, связанные с запросами данных, часто короче и более информативно. Это требует умеренных затрат на изучение синтаксиса и технологий, но преимущества значительно перевешивают недостатки.