Кто-нибудь придерживается каких-либо правил (или вы вынуждены придерживаться каких-либо правил вашим работодателем?) при выборе использования синтаксиса запроса LINQ или выражения Lambda внутри одного из методов расширения LINQ? Это относится к любым объектам, SQL, объектам и т.д.
На нашем рабочем месте мой босс вообще не любит лямбда, и он использует синтаксис запроса для чего-либо, что в некоторых случаях я считаю менее читаемым.
var names = collection.Select(item => item.Name);
var names = from item in collection
select item.Name;
Возможно, при добавлении условия, Lambda, который я нахожу, немного запутан, где
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.
Может ли кто-нибудь еще добавить к этому? У кого-нибудь есть свои собственные правила или их компания предлагает/принудительно использует один?