Programming Taskbook 0


Исходная посл. a: 13: 1 3 3 10 10 8 7 11 2 11 17 3 3


Download 1.62 Mb.
Pdf ko'rish
bet45/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   ...   41   42   43   44   45   46   47   48   ...   71
Bog'liq
Abramyan-Pascal2016-1

Исходная посл. a: 13: 1 3 3 10 10 8 7 11 2 11 17 3 3 
b = a.TakeWhile: 3: 1 3 3 
c = a.Skip: 6: 11 2 11 17 3 3 
d = b.Union(c): 5: 1 3 11 2 17 
d.SortedDescending: 5: 17 11 3 2 1 


Глава 4. Запросы 
73 
Рис. 10. Окно задачника с отладочным выводом для задачи LinqBegin29 
4.3.
Проецирование 
Запросы проецирования формируют на основе исходной последова-
тельности новую последовательность с элементами другого типа. Фор-
мально к подобным запросом можно отнести и группирующие запросы, од-
нако они имеют ряд особенностей и поэтому обычно рассматриваются от-
дельно (см. п. 4.5). В стандартной библиотеке .NET имеются два запроса 
проецирования: уже известный нам запрос Select (см. п. 3.4) и запрос Se-
lectMany. В библиотеку PascalABC.NET добавлены новые запросы проеци-
рования, упрощающие создание последовательностей кортежей специаль-
ного вида.
Проецирование
Методы sequence of T
 
Select(sel: (T[, integer]) -> TRes): sequence of TRes 
SelectMany(sel: (T[, integer]) -> sequence of TRes):
sequence of TRes 
SelectMany(sel: (T[, integer]) -> sequence of TMid; 
finalSel: (T, TMid) -> TRes): sequence of TRes 
* Numerate([from: integer]): sequence of (integer, T)
* Tabulate(f: T -> TRes): sequence of (T, TRes)
Запрос Select преобразует каждый элемент исходной последовательно-
сти, используя параметр-селектор sel (лямбда-выражение), и заносит пре-


74 
образованное значение в результирующую последовательность. Таким об-
разом, последовательность, полученная в результате применения запроса 
Select, всегда имеет тот же размер, что и исходная последовательность. 
Запрос SelectMany выполняется более сложным образом. Его параметр-
селектор sel преобразует каждый элемент исходной последовательности в 
последовательность новых значений. Если в запросе указан только один 
параметр (sel), то все значения из полученных последовательностей объ-
единяются и заносятся в результирующую последовательность. Если в за-
просе указан дополнительный параметр — финальный селектор finalSel, то 
он применяется к паре (e1, e2), где в качестве e1 берется очередной элемент 
из исходной последовательности, а в качестве e2 — каждый из элементов 
последовательности, полученной путем применения к e1 селектора sel (фи-
нальный селектор будет вызываться для каждого элемента e1 столько раз, 
сколько элементов входит в последовательность sel(e1)). Значения, возвра-
щенные финальным селектором finalSel, заносятся в результирующую по-
следовательность. 
Таким образом, в любом варианте запроса SelectMany по элементам ис-
ходной последовательности вначале формируется последовательность по-
следовательностей (такая последовательность называется иерархической), 
после чего эти иерархическая последовательность превращается в «плос-
кую», состоящую из элементов тех последовательностей, которые входили 
в иерархическую последовательность.
В отличие от запроса Select, который всегда возвращает последова-
тельность того же размера, что и исходная, запрос SelectMany может вер-
нуть последовательность как большего, так и меньшего размера. Размер 
может уменьшиться, если какие-либо элементы исходной последователь-
ности будут преобразованы селектором sel в пустые последовательности. 
Приведем пример. Если сформировать последовательность несколь-
ких двузначных целых чисел и «расщепить» каждое число на цифры с по-
мощью соответствующего лямбда-выражения (возвращающего последова-
тельность из двух цифр), то, указав это лямбда-выражение в запросе Select, 
мы получим иерархическую последовательность: 
var a := Range(12,15).Select(e -> Seq(e div 10, e mod 10)); 
Write(a); // [[1,2],[1,3],[1,4],[1,5]] 
При выводе полученной последовательности процедурой Write легко 
обнаружить «иерархическую природу» полученной последовательности, 
поскольку выведенный текст содержит вложенные квадратные скобки
означающие, что каждый элемент полученной последовательности также 
является, в свою очередь, последовательностью (из двух элементов). 


Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   ...   41   42   43   44   45   46   47   48   ...   71




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