День сто семьдесят пятый. #BestPractices

Когда использовать LINQ с синтаксисом запроса вместо методов. Продолжение



3. Несколько источников данных

Если у вас есть несколько источников данных для запроса, синтаксис запроса будет предпочтительнее. Причина в том, что вы можете использовать ключевое слово from несколько раз. Например:

var rows = Enumerable.Range(1, 3); //1,2,3

var columns = new string[] { "A", "B"};

var querySyntax = from row in rows

from col in columns

select $"cell [{row}, {col}]";

var methodSyntax =

rows.SelectMany(row => columns, (r, c) => $"cell [{r}, {c}]");

foreach (var cell in methodSyntax)

{

Console.WriteLine(cell);

}

//Вывод:

//cell[1, A]

//cell[1, B]

//cell[2, A]

//cell[2, B]

//cell[3, A]

//cell[3, B]

Цель здесь - получить коллекцию со всеми возможными комбинациями из 2 источников. С синтаксисом запроса код прост и не требует пояснений. А синтаксис методов вовсе не так очевиден для понимания.



4. GroupBy или group

Метод расширения GroupBy очень похож на group в запросе. Например:

var names = new string[] { "Alex", "George", "Alfredo", "Bo", "Greg", "Maxim" };

var querySyntax = from name in names

group name by name[0];

var methodSyntax = names

.GroupBy(name => name[0], name => name);

foreach (var pair in querySyntax)

{

var names1 = string.Join(", ", pair.ToList());

Console.WriteLine($"Key = {pair.Key} Names = {names1}");

}

//Вывод:

//Key = A Names = Alex, Alfredo

//Key = G Names = George, Greg

//Key = B Names = Bo

//Key = M Names = Maxim

Опять же, синтаксис методов не совсем ясен. Что означает второй параметр? Конечно, если немного подумать, смысл становится понятен. Но я не хочу думать, когда я смотрю на код, я хочу читать его как книгу. Детскую книгу, если это возможно.



5. Объединения

Как правило, всякий раз, когда вам нужно объединить коллекции, синтаксис запроса будет более читаемым. Вот внутреннее объединение, например:

var categories = new Category[]

{

new Category() {Name="Игрушки", ID=1},

new Category() {Name="Приборы", ID=2}

};

var products = new Product[]

{

new Product(){Name="Кукла", CategoryID=1},

new Product(){Name="Блендер", CategoryID=2},

new Product(){Name="Утюг", CategoryID=2},

new Product(){Name="Медведь", CategoryID=1}

};

var querySyntax =

from category in categories

join prod in products on category.ID equals prod.CategoryID

select new { ProductName = prod.Name, Category = category.Name };

var methodSyntax = categories.Join(products,

category => category.ID,

prod => prod.CategoryID,

(category, prod) => new {ProductName = prod.Name, Category = category.Name});

В синтаксисе методов сравниваются 2-й и 3-й параметры объединения. Но в отличие от синтаксиса запроса, это не совсем понятно из кода. В синтаксисе запросов это намного понятнее.



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



Источник:
https://michaelscodingspot.com/