Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
- Bu sahifa navigatsiya:
- [[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]]
- [(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]
- [(10,29),(33,84),(40,59),(52,53)] Завершая рассмотрение запросов группировки, рассмотрим задачу LinqBegin57
- LinqBegin57 ); // Вариант 1
- LinqBegin57 ); // Вариант 2
- LinqBegin57 ); // Вариант 3
Глава 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling