Я часто использую LINQ в своем повседневном программировании. На самом деле, я редко, если вообще когда-либо, использую явный цикл. Однако я обнаружил, что больше не использую синтаксис SQL. Я просто использую функции расширения. Так что скорее тогда говорят:
from x in y select datatransform where filter
Я использую:
x.Where(c => filter).Select(c => datatransform)
Какой стиль LINQ вы предпочитаете, и кому из вашей команды это удобно?
c#
coding-style
linq
Erin
источник
источник
Ответы:
К сожалению, позиция Microsoft в отношении документации MSDN заключается в том, что синтаксис запроса предпочтительнее, потому что я никогда не использую его, но все время использую синтаксис метода LINQ. Мне нравится, когда я могу отвечать на однострочные запросы до глубины души. Для сравнения:
Для того, чтобы:
Быстрее, меньше строк, и на мой взгляд выглядит чище. Синтаксис запроса также не поддерживает все стандартные операторы LINQ. Пример запроса, который я недавно сделал, выглядел примерно так:
Насколько мне известно, для репликации этого запроса с использованием синтаксиса запроса (насколько это возможно) это будет выглядеть так:
Это не выглядит более читабельным для меня, и вам все равно нужно знать, как использовать синтаксис метода. Лично я действительно восхищен декларативным стилем, который делает возможным LINQ, и использую его в любой ситуации, когда это вообще возможно - возможно, иногда к моему ущербу. Например, с синтаксисом метода я могу сделать что-то вроде этого:
Я полагаю, что вышеприведенный код будет трудно понять для тех, кто входит в проект без хорошей документации, и если у них нет достаточного опыта в LINQ, они все равно могут его не понять. Тем не менее, синтаксис метода предоставляет довольно мощную возможность быстро (с точки зрения строк кода) проецировать запрос, чтобы получить сводную информацию о нескольких коллекциях, которые в противном случае потребовали бы много утомительного цикла foreach. В таком случае синтаксис метода очень компактен для того, что вы получаете из него. Попытка сделать это с помощью синтаксиса запроса может быть довольно громоздкой.
источник
Я нахожу функциональный синтаксис более приятным для глаз. Единственное исключение - если мне нужно объединить более двух комплектов. Join () очень быстро сходит с ума.
источник
Не слишком ли поздно добавить еще один ответ?
Я написал тонну кода LINQ-to-objects, и я утверждаю, что по крайней мере в этой области хорошо понимать оба синтаксиса, чтобы использовать тот, который создает более простой код - что не всегда является точечным синтаксисом.
Конечно , бывают случаи , когда дот-синтаксис IS путь - другие представили несколько таких случаев; Тем не менее, я думаю, что понимание было коротким - дал плохой рэп, если хотите. Поэтому я приведу пример, где я считаю, что понимание полезно.
Вот решение головоломки подстановки цифр: (решение написано с использованием LINQPad, но может быть автономно в консольном приложении)
... какие выводы:
Не так уж и плохо, логика течет линейно, и мы видим, что она предлагает единственное правильное решение. Эту загадку достаточно легко решить вручную: 3>>
N
0 иO
> 4 * N подразумевают 8> =O
> = 4. Это означает, что есть максимум 10 случаев для ручного тестирования (2 дляN
-by- 5 дляO
). Я заблудился достаточно - эта головоломка предлагается для иллюстрации LINQ.Преобразования компилятора
Компилятор многое делает, чтобы перевести это в эквивалентный точечный синтаксис. Помимо обычных вторых и последующих
from
предложений превращаются вSelectMany
вызовы, у нас естьlet
предложения, которые становятсяSelect
вызовами с проекциями, оба из которых используют прозрачные идентификаторы . Как я собираюсь показать, необходимость называть эти идентификаторы в точечном синтаксисе лишает возможности чтения такого подхода.У меня есть хитрость для разоблачения того, что делает компилятор при переводе этого кода в точечный синтаксис. Если вы раскомментируете две закомментированные строки выше и запустите его снова, вы получите следующий вывод:
Помещая каждый оператор LINQ в новую строку, переводя «невыразимые» идентификаторы в те, которые мы можем «говорить», изменяя анонимные типы в их привычную форму и изменяя язык
AndAlso
выражения дерева выражений, чтобы&&
представить преобразования, которые компилятор делает для получения эквивалентных в точечном синтаксисе:Который, если вы запустите, вы можете проверить, что он снова выводит:
... но ты когда-нибудь написал бы такой код?
Держу пари, что ответ НОНБН (не только нет, но, черт возьми, нет!), Потому что это слишком сложно. Конечно, вы можете придумать более значимые имена идентификаторов, чем «temp0» .. «temp3», но дело в том, что они ничего не добавляют в код - они не делают код лучше, они не делают сделать код лучше читаемым, он только уродлив код, и если вы делали это вручную, без сомнения, вы бы испортили его раз или три, прежде чем сделать это правильно. Кроме того, играть в «игру с именем» достаточно сложно для значимых идентификаторов, поэтому я приветствую перерыв в игре с именами, которую компилятор предоставляет мне в понимании запросов.
Этот образец головоломки может оказаться недостаточно реальным для вас, чтобы воспринимать его всерьез; Тем не менее, существуют другие сценарии, где понимание запросов блестит:
Join
иGroupJoin
: область видимости переменных диапазона вjoin
предложениях по пониманию запросов превращает ошибки, которые в противном случае могли бы компилироваться в синтаксисе точек, в ошибки времени компиляции в синтаксисе понимания.from
предложения,join
&join..into
предложения иlet
предложения.Я знаю больше, чем один инженерный магазин в моем родном городе, где запрещен синтаксис понимания. Я думаю, что это жаль, поскольку синтаксис понимания - всего лишь инструмент и полезный. Я думаю, что это очень похоже на высказывание: «Есть вещи, которые вы можете сделать с помощью отвертки, которые вы не можете сделать с помощью зубила. Поскольку вы можете использовать отвертку в качестве зубила, отныне зубья запрещены по указу короля».
источник
Мой совет - использовать синтаксис понимания запросов, когда все выражение можно сделать в синтаксисе понимания. То есть я бы предпочел:
в
Но я бы предпочел
в
Хотелось бы, чтобы мы придумали какой-то синтаксис, который бы смешивал их лучше. Что-то типа:
Но, к сожалению, мы этого не сделали.
Но в основном это вопрос предпочтений. Сделайте тот, который выглядит лучше для вас и ваших коллег.
источник
var londonCustomers = from c in ...; int count = londonCustomers.Count();
SQL-как хороший способ начать. Но поскольку он ограничен (он поддерживает только те конструкции, которые поддерживает ваш текущий язык), в конце концов, разработчики переходят на стиль расширенных методов.
Я хотел бы отметить, что есть некоторые случаи, которые могут быть легко реализованы в стиле SQL.
Также вы можете комбинировать оба способа в одном запросе.
источник
Я склонен использовать синтаксис, не связанный с запросом, если мне не нужно определять переменную посередине, хотя запрос похож
но я пишу синтаксис без запроса, как
источник
Я всегда использую функции расширения из-за порядка. Возьмите свой простой пример - в SQL вы написали select first - хотя на самом деле сначала выполнялось где. Когда вы пишете, используя методы расширения, тогда я чувствую себя намного лучше. Я получаю Intellisense о том, что предлагается, я пишу вещи в том порядке, в котором они происходят.
источник
Мне тоже нравится функция расширения.
Может быть, потому что это меньше, чем прыжок синтаксиса в моей голове.
Это также более читабельно, особенно если вы используете сторонние фреймворки, в которых есть linq api.
источник
Вот эвристика, которой я следую:
Я думаю, что лямбды с соединениями выглядят грязно и их трудно читать.
источник