Я бы сделал это за три прохода, отфильтровав массив с желаемым 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
"Точечную" нотацию обычно называют синтаксисом Лямбды. Первая нотация идет многими именами, но я обычно называю ее синтаксисом запроса.
я работаю над командой 10 разработчиков, и мы спорим подробно, о котором мы должны использовать в качестве стандарта. В целом более закаленное (с LINQ) разработчики мигрируют к синтаксису Лямбды, но существуют значительные исключения.
Лямбда более кратка, но работает, несколько соединений таблицы являются кошмаром. Соединения являются просто намного более чистыми с синтаксисом запроса. Оборот - то, что существует много операций LINQ, которые только существуют в синтаксисе Лямбды: Единственный (), Сначала (), количество () и т.д.
Так, использование, с чем Вы чувствуете себя больше всего комфортно и понимаете что, как Вы приобретаете опыт, Ваше предпочтение, вероятно, изменится. Существует большое значение в способности считать обоих и конечно, будут ситуации, где необходимо использовать и то, и другое. Другие ситуации предоставят themselve одному стилю по другому. В конце все это переводится в тот же исполняемый код.
Ну, 'точечная' нотация может быть намного короче. Возьмите:
var result = from p in dc.Products
where p.Id > 5
select p;
или:
var result = dc.Products.Where(p => p.Id > 5);
я предпочитаю последнего, так как это намного короче, и более читаемо.
Я использую, какой бы ни синтаксис более читаем для моего запроса в зависимости от конкретного случая.
, Где возможно, я стараюсь не смешивать и соответствовать этим двум, хотя иногда это хорошо (если это - единственный вызов к 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 без выражений запроса, таким образом, нет никакого штрафа за то, что сделали это.
Они компилируют в тот же код, или довольно сначала каждый сначала переводится во второе и затем скомпилированный.
Вы правы, что различие - то, что первая версия является более чистой, но более ограниченной. Во втором уже можно, например, использовать существующих делегатов, например:
Func<int, bool> isEven = i => i%2 == 0;
Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine);
Я считаю лямбда-нотацию более аккуратной и лаконичной. Меня просто раздражает то, что если у вас есть лямбда-выражение где угодно внутри вызова метода, вы не можете изменять код на лету в режиме отладки ...