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
|
Abramyan-Pascal2016-1
- Bu sahifa navigatsiya:
- Проецирование Методы sequence of T Select
- Numerate ([
- [[1,2],[1,3],[1,4],[1,5]]
Исходная посл. 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 легко обнаружить «иерархическую природу» полученной последовательности, поскольку выведенный текст содержит вложенные квадратные скобки, означающие, что каждый элемент полученной последовательности также является, в свою очередь, последовательностью (из двух элементов). |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling