Каждый раз, когда я вижу вопрос, опубликованный в Stack Overflow на C #, я вижу по крайней мере один или два опубликованных ответа, которые решают проблему с LINQ. Обычно люди с очень высокой репутацией используют LINQ как профессионалы.
Итак, мой вопрос: для какой проблемной области предполагается использовать LINQ?
Также на примечаниях стороны: Есть ли какие-либо цели, в которых это следует избегать? Влияет ли размер набора данных на производительность запросов LINQ?
c#
linq
professional-development
user1816120
источник
источник
Ответы:
LINQ в первую очередь предназначен для обеспечения чисто функциональных запросов и преобразований в последовательности данных (вы заметите, что все расширения LINQ принимают делегаты Func, но не делегаты Action). Следовательно, наиболее распространенным случаем цикла, который не очень хорошо подходит для LINQ, является случай, связанный с не чисто функциональными побочными эффектами, например
Чтобы лучше использовать LINQ, просто попрактикуйтесь в его использовании.
Каждый раз, когда вы собираетесь написать цикл
for
илиforeach
цикл, чтобы сделать что-то с коллекцией, остановитесь, подумайте, хорошо ли это подходит для LINQ (т.е. это не просто выполнение действия / побочного эффекта над элементами), и если это так, заставьте себя писать это с помощью LINQ.Вы также можете
foreach
сначала написать версию, а затем переписать в версию LINQ.Как указывает svick, LINQ должен сделать вашу программу более читабельной. Обычно это хорошо, так как имеет тенденцию подчеркивать намерения кода, а не механизм; однако, если вы обнаружите, что не можете сделать свои запросы более читабельными, чем простой цикл, не стесняйтесь придерживаться цикла.
Если вам нужны упражнения для практики, большинство упражнений по функциональному программированию будут хорошо отображаться в LINQ, например, 99 задач (особенно первые 20 или около того) или проект Эйлера .
источник
Aggregate()
. Я думаю, что большую часть времени цикл более читабелен.Чтобы ответить на отредактированный вопрос: короче говоря, полезно использовать LINQ всякий раз, когда вам нужно реализовать функцию «запроса» (это то, что обозначает Q в LINQ). Определить точный домен сложно, но он значительно упрощает различные задачи, связанные с извлечением данных из коллекций и манипулированием ими.
Чтобы уточнить, многие функции запросов были перенесены непосредственно в язык (точнее, в различные LINQ-разработчики), поэтому такие вещи, как агрегация, упорядочение, группировка, фильтрация, проекции, объединения (и многие другие), все обрабатываются для вы. Решения на основе LINQ, как правило, также намного короче, чем если бы вы реализовывали их «вручную», а также гораздо лучше сообщают о своих намерениях.
Простой пример, который часто помогает передать всю мощь LINQ, - это отображение содержимого каталога, сгруппированного по расширению. Выполните типичную императивную реализацию в своей голове - там будет много деталей реализации уже с самого начала. Возможно, мы будем использовать
Dictionary<String, List<String>>
для индексации файлов по расширению. Конечно, нам нужно проверить, существует ли ключ, создать список, добавить его и т. Д. Он может выглядеть примерно так:Рассмотрим эквивалент LINQ:
Обратите внимание, что сам запрос состоит всего из 2 строк, что, безусловно, короче любого обязательного решения, которое мы могли бы предложить. Это также довольно читабельно; отношение сигнал / шум выше, чем при первом решении. Для тех, кто не знаком с LINQ, вы должны вывести результаты этого запроса следующим образом:
В более сложных примерах различия обычно становятся еще более значительными (например, рассмотрите возможность группировки по нескольким полям). Подводя итог, можно сказать, что LINQ решает многие «повседневные» проблемы, связанные с запросами данных, часто короче и более информативно. Это требует умеренных затрат на изучение синтаксиса и технологий, но преимущества значительно перевешивают недостатки.
источник
Со временем были разработаны разные языки для различных типов источников данных, например, SQL для реляционных баз данных и XQuery для XML. Поэтому разработчикам приходилось изучать новый язык запросов для каждого типа источника данных или формата данных, который они должны поддерживать. LINQ упрощает эту ситуацию, предлагая согласованную модель для работы с данными в различных источниках данных и форматах. В запросе LINQ вы всегда работаете с объектами. для получения дополнительной информации посетите http://msdn.microsoft.com/en-us/library/bb397906.aspx
источник