LINQ-синтаксис запроса vs цепочки методов и лямбда [закрыто]


кто-нибудь придерживается каких-либо правил (или вы вынуждены придерживаться каких-либо правил вашим работодателем?) при выборе использования синтаксиса запроса LINQ или лямбда-выражения внутри одного из методов расширения LINQ? Это относится к любым сущностям, SQL, объектам, чему угодно.

на нашем рабочем месте мой босс вообще не любит лямбда, и он будет использовать синтаксис запроса для чего-либо, что в некоторых случаях я нахожу менее читаемым.

var names = collection.Select(item => item.Name);

var names = from item in collection
            select item.Name;

возможно при добавлении условия, лямбда Я нахожу становится немного грязно, где

var names = collection.Where(item => item.Name == "Fred")
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            select item.Name;

просто из интереса:как компилятор относится к этому? Кто-нибудь знает, как приведенный выше запрос LINQ будет компилироваться в лямда? Будет ли Name свойство вызывается для каждого элемента? Можем ли мы сделать это вместо этого и потенциально улучшить производительность? Означает ли это, что лямбда немного более управляема с точки зрения производительности?

var names = collection.Select(item => item.Name)
                      .Where(name => name == "Fred");

конечно, когда мы начинаем использовать все больше и больше выражений, лямбда становится грязным и я бы начал использовать синтаксис запроса здесь.

var names = collection.Where(item => item.Name == "Fred")
                      .OrderBy(item => item.Age)
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            order by item.Age
            select item.Name;

есть также несколько вещей, которые я нахожу, не может быть сделано с синтаксисом запроса. Некоторые из них, как вы думаете, были бы очень простыми (особенно агрегатные функции), но нет, вам нужно добавить один из методов расширения LINQ до конца, который imo, выглядит более аккуратным с лямбда-выражением.

var names = collection.Count(item => item.Name == "Fred");

var names = (from item in collection
            where item.Name == "Fred"
            select item).Count()

даже для некоторых простых лямбда цепей, для ReSharper предлагает мне конвертировать их в LINQ запрашивать.

может ли кто-нибудь еще добавить к этому? У кого-нибудь есть свои маленькие правила или их компания предлагает/заставляет использовать один?

1 52

1 ответ:

чтобы ответить на ваш вопрос о переводе, выражение запроса всегда будет переведено на основе правил 7.16 спецификации C# 4 (или эквивалента в спецификации C# 3). В Примере, где вы задаете вопрос о Name свойства, это не вопрос перевода выражения запроса - это то, что Select и Where методы с делегатов или деревьев выражений, которые они принимают в качестве параметров. Иногда имеет смысл сделать проекцию перед фильтрацией, иногда нет.

что касается небольших правил, у меня есть только одно: используйте тот способ, который наиболее читаем для рассматриваемого запроса. Поэтому, если запрос изменяется и "какая форма более читабельна" изменяется одновременно, измените используемый синтаксис.

если вы собираетесь использовать LINQ вы должны будьте счастливы с любым синтаксисом, по крайней мере, читать.

Я как правило чтобы найти запросы с несколькими переменными диапазона (например, через SelectMany или Join, или a let предложение) в конечном итоге становится более читаемым с помощью выражений запроса - но это далеко не жесткое и быстрое правило.