LINQ: запись через точку по сравнению с выражением запроса

Я бы сделал это за три прохода, отфильтровав массив с желаемым dd и сгруппировав по jlo, затем извлекая jlo из первого (гарантированного) элемента массива и его длину: [118 ]

map(select(.dd == "d5f")) | group_by(.jlo) | map("\(.[0].jlo) \(length)") | .[]

Вы можете попробовать здесь .

Полный запуск bash:

jq --arg dd d5f --raw-output 'map(select(.dd == $dd)) | group_by(.jlo) | map("\(.[0].jlo) \(length)") | .[]' yourJsonFile > departmentone.txt
jq --arg dd 5d9 --raw-output 'map(select(.dd == $dd)) | group_by(.jlo) | map("\(.[0].jlo) \(length)") | .[]' yourJsonFile > departmentalt.txt
jq --arg dd 1b1 --raw-output 'map(select(.dd == $dd)) | group_by(.jlo) | map("\(.[0].jlo) \(length)") | .[]' yourJsonFile > departmentshort.txt

Предположим, у вас есть файл с именем «mapping.txt» со следующим содержимым:

d5f:departmentone
5d9:departmentalt
1b1:departshort

Вы можете извлечь эти коды и метки для генерации файлы:

while IFS=: read -r code label; do
    jq --arg dd $code --raw-output 'map(select(.dd == $dd)) | group_by(.jlo) | map("\(.[0].jlo) \(length)") | .[]' yourJsonFile > "$label".txt
done < mapping.txt

57
задан Rowan Richards 11 July 2019 в 10:48
поделиться

5 ответов

"Точечную" нотацию обычно называют синтаксисом Лямбды. Первая нотация идет многими именами, но я обычно называю ее синтаксисом запроса.

я работаю над командой 10 разработчиков, и мы спорим подробно, о котором мы должны использовать в качестве стандарта. В целом более закаленное (с LINQ) разработчики мигрируют к синтаксису Лямбды, но существуют значительные исключения.

Лямбда более кратка, но работает, несколько соединений таблицы являются кошмаром. Соединения являются просто намного более чистыми с синтаксисом запроса. Оборот - то, что существует много операций LINQ, которые только существуют в синтаксисе Лямбды: Единственный (), Сначала (), количество () и т.д.

Так, использование, с чем Вы чувствуете себя больше всего комфортно и понимаете что, как Вы приобретаете опыт, Ваше предпочтение, вероятно, изменится. Существует большое значение в способности считать обоих и конечно, будут ситуации, где необходимо использовать и то, и другое. Другие ситуации предоставят themselve одному стилю по другому. В конце все это переводится в тот же исполняемый код.

54
ответ дан andleer 24 November 2019 в 19:37
поделиться

Ну, 'точечная' нотация может быть намного короче. Возьмите:

var result = from p in dc.Products
             where p.Id > 5
             select p;

или:

var result = dc.Products.Where(p => p.Id > 5);

я предпочитаю последнего, так как это намного короче, и более читаемо.

8
ответ дан Razzie 24 November 2019 в 19:37
поделиться

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

, Где возможно, я стараюсь не смешивать и соответствовать этим двум, хотя иногда это хорошо (если это - единственный вызов к First() в конце запроса, например). Задержанное выполнение означает, что столь же эффективно использовать выражение запроса и присвоить результат переменной и затем использовать запись через точку использование что переменная:

var query = from x in y
            orderby z
            group x by x.Name into groups
            // etc
            select foo;

var page = query.Skip(50).Take(10);

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

28
ответ дан Jon Skeet 24 November 2019 в 19:37
поделиться

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

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

Func<int, bool> isEven = i => i%2 == 0;
Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine);
2
ответ дан user76035 24 November 2019 в 19:37
поделиться

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

3
ответ дан 24 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: