Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet54/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   ...   50   51   52   53   54   55   56   57   ...   71
Bog'liq
Abramyan-Pascal2016-1


Глава 4. Запросы 
87 
раметр — лямбда-выражение, которое применяет к каждой группе некото-
рое преобразование перед помещением результата в итоговую последова-
тельность. Если параметр не указан, то в итоговую последовательность 
помещаются сами группы в виде последовательностей: 
var a := Seq(10, 29, 33, 84, 40, 59, 52, 53, 60); 
Writeln(a.Batch(2)); // [[10,29],[33,84],[40,59],[52,53],[60]] 
Writeln(a.Batch(2, ee -> ee.Sum)); // [39,117,99,105,60] 
Writeln(a.Batch(3)); // [[10,29,33],[84,40,59],[52,53,60]] 
Writeln(a.Batch(4)); // [[10,29,33,84],[40,59,52,53],[60]] 
Запрос Pairwise разбивает исходную последовательность на пары со-
седних элементов, причем пары являются перекрывающимися — напри-
мер, второй элемент последовательности входит в две пары: с первым и с 
третьим элементом. Запрос Pairwise может иметь параметр — лямбда-
выражение, которое определяет, каким образом надо преобразовать пару 
соседних элементов перед помещением результата в итоговую последова-
тельность. Если параметр не указан, то в итоговую последовательность 
помещаются пары соседних элементов в виде кортежей: 
var a := Seq(10, 29, 33, 84, 40, 59, 52, 53); 
Writeln(a.Pairwise);
// [(10,29),(29,33),(33,84),(84,40),(40,59),(59,52),(52,53)] 
Writeln(a.Pairwise((e1, e2) -> e1 + e2));
// [39,62,117,124,99,111,105] 
Заметим, что для получения неперекрывающихся пар элементов (в 
предположении, что последовательность имеет четный размер) достаточно 
использовать комбинацию запросов Pairwise и Slice (см. п. 3.7): 
var a := Seq(10, 29, 33, 84, 40, 59, 52, 53); 
Writeln(a.Pairwise.Slice(0, 2));
// [(10,29),(33,84),(40,59),(52,53)] 
Завершая рассмотрение запросов группировки, рассмотрим задачу 
LinqBegin57. В ней дается целочисленная последовательность и требуется 
выбрать максимальный элемент среди всех ее элементов, оканчивающихся 
одной и той же цифрой. Полученную последовательность максимальных 
элементов надо упорядочить по возрастанию их последних цифр: 
Task('LinqBegin57'); // Вариант 1 
ReadSeqInteger.GroupBy(e -> Abs(e) mod 10, (k, ee) -> ee.Max) 
.OrderBy(e -> Abs(e) mod 10).WriteAll; 
Здесь мы использовали третий вариант запроса GroupBy, заменив в фи-
нальном селекторе полученные группы элементов на максимальные эле-
менты этих групп. При формировании ключа необходимо использовать 


88 
функцию Abs, так как среди элементов исходной последовательности мо-
гут быть отрицательные. 
Чтобы избежать повторного вычисления ключа в запросе сортировки 
OrderBy, можно создать при группировке кортеж из двух полей: ключа и 
максимального значения, однако в этом случае перед выводом результатов 
придется дополнительно вызвать запрос Select: 
Task('LinqBegin57'); // Вариант 2 
ReadSeqInteger.GroupBy(e -> Abs(e) mod 10, (k,
ee) -> (k,
ee.Max)) 
.OrderBy(e -> e[0]).Select(e -> e[1]).WriteAll; 
Наконец, приведем решение, в котором используется первый вариант 
запроса GroupBy (совместно с запросом Select): 
Task('LinqBegin57'); // Вариант 3 
ReadSeqInteger.GroupBy(e -> Abs(e) mod 10) 
.OrderBy(ee -> ee.Key).Select(ee -> ee.Max).WriteAll; 
В этом варианте при сортировке указывается свойство Key получен-
ных групп элементов (напомним, что группы в данном случае имеют тип 
IGrouping), а максимальный элемент в этих группах определяется в запросе 
Select. Вариант 3 является более наглядным, чем вариант 2, и, в отличие от 
варианта 1, не требует повторного вычисления ключа в запросе сортиров-
ки. 
4.6.
Запросы экспортирования и вспомогательные 
запросы 
В данном, завершающем пункте главы 4 мы рассмотрим экспортиру-
ющие запросы, связанные с преобразованием последовательностей в 
структуры других типов, а также некоторые запросы, для которых сложно 
подобрать какую-либо определенную категорию. 
Ранее мы уже отмечали, что многие структуры данных могут быть 
преобразованы в последовательности автоматически; такие структуры 
данных мы назвали коллекциями. К коллекциям можно применять любые 
запросы; при этом коллекция преобразуется в последовательность, а к по-
лученной последовательности применяется указанный запрос. 
Однако обратное преобразование последовательности в структуру 
другого типа необходимо выполнять явным образом. Таким преобразова-
ния обеспечивает особая группа экспортирующих запросов. Часть экспор-
тирующих запросов определена в стандартной библиотеке платформы 
.NET, а часть реализована в библиотеке PascalABC.NET. 

Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   ...   50   51   52   53   54   55   56   57   ...   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling