<Array><!-- Источник массива --> <Source></Source><!-- Получение индекса первого элемента. --> <Filter> <Not> <And> <Or> <FilterType="Equal"><!-- или Field (для DC) или Index (для массивов)--> <Field></Field> <Index></Index> <DataTypeType=""></DataType> <Value></Value> </Filter> </Or> </And> </Not> </Filter><!-- Уникальные элементы в массиве. Если теги On не указаны, используется первый элемент --> <Distinct> <OnIndex="" /> </Distinct><!-- Сортировка. Если теги By не указаны, используется первый элемент и сортируется по возрастанию --> <Order> <ByIndex=""Type="Asc" /> <ByIndex=""Type="Desc" /> </Order><!-- Создать новый массив на основе существующего. Если Items.Count == 1 то возвращает одномерный массив --> <Select> <Items><!-- Элемент массива --> <ItemType="Index"></Item><!-- Выбор из словаря --> <ItemType="Field"><!-- название элемента словаря --></Item><!-- Скалярное значение --> <ItemType="Value"></Item><!-- Порядковый номер элемента массива --> <ItemType="Number"Start="0"></Item><!-- Форматирование значений --> <ItemType="Format"></Item><!-- Работа с вложенными массивами --> <ItemType="Action"> <Index><!-- индекс элемента массива --></Index> <Actions><!-- цепочка действий. Доступны все действия над массивами--></Actions> </Item><!-- Расчет выражения --> <ItemType="Expression"><!-- В выражении могут использоваться элементы массива ([0]) и дополнительные значения ({0}).--><!-- Дополнительно можно добавить переменную Index --> <Expression>{0} > 0</Expression> <Items><!-- Дополнительные значения --> <Item></Item> </Items> </Item><!-- Подстановка значений --> <Item> <Index><!-- индекс элемента массива --></Index> <Value><!-- таблица значений --></Value> </Item> </Items> </Select> </Array>
Полный шаблон Array
<Array><!-- Источник массива --> <Source></Source><!-- Добавить в массив значение и вернуть новый массив --> <Add></Add> <!-- Возвращает элемент массива. Для одномерного массива возвращается скалярное значение. Для многомерного - одномерный массив значений -->
<ElementAt> <Index><!-- value --></Index> </ElementAt><!-- Удаление элементов из массива --> <Remove><!-- Для удаления одного элемента --> <Index></Index><!-- Для удаления нескольких элементов --> <Indices> <Index></Index> </Indices> <StructureType="List"> <Item></Item> <Item></Item> <Item></Item> </Structure> </Remove><!-- Обновить элемент по индексу --> <Update> <Index></Index><!-- Для одномерного массива --> <Value></Value><!-- Для многомерных массивов --> <Value> <Row> <Item></Item> </Row> </Value> </Update> <!-- Создать новый массив на основе существующего. Операция Map. Если Items.Count == 1 то возвращает одномерный массив -->
<Select> <Items> <ItemType="Expression"><!-- В выражении могут использоваться элементы массива ([0]) и дополнительные значения ({0}).--><!-- Дополнительно можно добавить переменную Index --> <Expression>{0} > 0</Expression> <Items> <Item></Item> <Items> </Item><!-- Скалярное значение --> <ItemType="Value"></Item><!-- Элемент массива --> <ItemType="Index"></Item><!-- Порядковый номер элемента массива --> <ItemType="Number"Start="0"></Item><!-- Форматирование значений --> <ItemType="Format"></Item><!-- Работа с вложенными массивами --> <ItemType="Action"> <Index><!-- индекс элемента массива --></Index> <Actions><!-- цепочка действий. Доступны все действия над массивами--></Actions> </Item><!-- Подстановка значений --> <Item> <Index><!-- индекс элемента массива --></Index> <Value><!-- таблица значений --></Value> </Item><!-- Выбор из словаря --> <ItemType="Field"><!-- название элемента словаря --></Item> </Items> </Select> <!-- Агрегация значений. Операция Reduce/Fold. Для одного элемента - скаляр. Для нескольких элементов одномерный массив значений -->
<Aggregate> <Items> <Item><!-- Начальное значение --> <Result>0</Result><!-- В выражении могут использоваться элементы массива ([0]) и дополнительные значения ({0}).--><!-- Дополнительно можно добавить переменную Index --><!-- Полученный результат сохраняется в Result и вычисляется значение для следующей строки --><!-- Пример расчёта суммы --> <Expression>{Result} + {0}</Expression> <Items> <Item></Item> <Items> </Item> </Items> </Aggregate><!-- Максимальный элемент. Только для одномерных массивов --> <MaxType="" /><!-- Минимальный элемент. Только для одномерных массивов --> <MinType="" /><!-- Получение индекса первого элемента. --> <Filter> <Not> <And> <Or> <FilterType="Equal"><!-- или Field (для DC) или Index (для массивов)--> <Field></Field> <Index></Index> <DataTypeType=""></DataType> <Value></Value> </Filter> </Or> </And> </Not> </Filter><!-- Первый элемент --> <First /><!-- Последний элемент --> <Last /><!-- Форматирует текущий массив в строку --> <!-- Если элемент массива Dictionary<string, object>, то доступны поля по {Key}. Для одномерных массивов {0}, {1} -->
<Format></Format><!-- Объединяет текущий массив в строку с разделителем --> <StringJoinSeparator="<!-- разделитель элементов -->"LineSeparator="<!-- разделитель строк -->" /><!-- Пропустить N строк --> <Skip></Skip><!-- Взять из массива N строк --> <Take></Take><!-- Количество элементов в массиве --> <Count /><!-- Уникальные элементы в массиве. Если теги On не указаны, используется первый элемент --> <Distinct> <OnIndex="" /> </Distinct><!-- Индекс элемента (только для одномерных массивов) --><!-- Содержимое тега аналогично тегу Filter --> <IndexOf></IndexOf><!-- Преобразовать одномерный массив в многомерный. Для многомерных ничего не делается --> <ToTable /><!-- Преобразование значение в одномерный массив --> <ToArray /><!-- Преобразование двухмерного массива в массив словарей --> <ToDictionary><!-- Атрибут Name: название элемента словаря --> <!-- Атрибут Index: индекс элемента массива, который будет записан в словарь под именем указанным в атрибуте Name -->
<KeyName=""Index=""/> </ToDictionary><!-- Сортировка (только для одномерных массивов) --> <Sort /><!-- Сортировка. Если теги By не указаны, используется первый элемент и сортируется по возрастанию --> <Order> <ByIndex=""Type="Asc" /> <ByIndex=""Type="Desc" /> </Order><!-- Объединение массивов --> <Union><!-- массив --></Union> <!-- Для ConvertDC. Для массива Dictionary<string, object> формирует массив из значений словаря по указанному ключу -->
<Field><!-- field name --></Field><!-- Преобразовать массив массивов ([[1,2,3,...], [4,5,...]]) в одномерный ([1,2,3,...,4,5,...]) --> <SelectMany></SelectMany><!--Объединения массивов по ключам--><!-- Inner - текущий массив, Outer - массив с которыем будет соединён текущий --> <Join> <OuterArray><!-- массив с которым будет текущий соединён--></OuterArray><!--Ключи по которым будуд соединяться массивы--> <Keys><!-- Атрибут Index: индекс элемента массива, который будет использоваться в качестве составного ключа --><!-- Количество тегов Inner и Outer должно совпадать --> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Keys><!-- Результат объединения --> <Result> <!-- Атрибут Index: индекс элемента массива, который будет добавлен в результирующую строку. Если тег Inner, то значение будет выбрано из исходного массива. Если Outer, то из массива из тега OuterArray -->
<InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Result> </Join><!-- Левостороннее соединение --> <LeftJoin> <OuterArray></OuterArray> <Keys> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Keys> <Result> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Result> </LeftJoin><!-- Правостороннее соединение --> <RightJoin> <OuterArray></OuterArray> <Keys> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Keys> <Result> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Result> </RightJoin><!-- Полное соединение --> <FullJoin> <OuterArray></OuterArray> <Keys> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Keys> <Result> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Result> </FullJoin></Array>
Описание Array
Значение, которое будет передано в команду при выполнении.
В тэге <Source> указывается любое универсальное значение, с которым выполняются операции указанные после тэга <Source> - Operation1, Operation2. Операций может быть неограниченное количество. При этом операции будут выполняться последовательно в порядке объявления: для первой операции (Operation1) используется значение из тэга <Source>, для последующих операций - результат предыдущей операции.
Все операции можно разделить на группы:
Изменение
Агрегация
Поиск
Соединение
Выборка из массива
Преобразование
Сортировка
Изменение
Add
Добавляет элемент или элементы в массив.
<Add><!-- элементы для добавления --></Add>
При добавлении элементов используются следующие правила:
Матрица добавляется в Матрицу
Строки из матрицы, указанной в тэге <Value>, добавляются в конец матрицы из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | Text 3 |
| 4 | Text 4 |
+-----+----------+
Массив добавляется в Матрицу
В массив из тэга <Value> добавляются пустые элементы, чтобы длина массива соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
Скаляр добавляется в Матрицу
Скаляр из тэга <Value> преобразуется в массив с длиной соответствующей наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
Во всех случаях, когда в качестве значения тэга <Source> указан скаляр, будет генерироваться ошибка TypeMismatch.
InsertAt
Добавляет элемент или элементы в массив в указанную позицию.
<InsertAt> <Index><!-- индекс элемента --></Index> <Value><!-- элементы для добавления --></Value></InsertAt>
При добавлении элементов используются следующие правила:
Матрица добавляется в Матрицу
Строки из матрицы, указанной в тэге <Value>, добавляются в конец матрицы из тэга <Source> или в позицию с индексом из тэга <Index>.
+-----+----------+
| 1 | Text 1 |
| 3 | Text 3 |
| 4 | Text 4 |
| 2 | Text 2 |
+-----+----------+
Массив добавляется в Матрицу
В массив из тэга <Value> добавляются пустые элементы, чтобы длина массива соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы или в позицию с индексом из тэга <Index>.
Скаляр добавляется в Матрицу
Скаляр из тэга <Value> преобразуется в массив с длиной соответствующей наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы или в позицию с индексом из тэга <Index>.
Матрица добавляется в Массив
Первый столбец матрицы, указанной в тэге <Value>, преобразуется в массив и добавляется в конец массива из тэга <Source> или в позицию с индексом из тэга <Index>.
Во всех случаях, когда в качестве значения тэга <Source> указан скаляр, будет генерироваться ошибка TypeMismatch.
Update
Обновляет элемент в массиве/матрице в указанной позиции.
<Update> <Index><!-- индекс элемента --></Index> <Value><!-- элемент для обновления --></Value></Update>
При обновлении элементов используются следующие правила:
Массив добавляется в Матрицу
В массив из тэга <Value> добавляются пустые элементы, чтобы длина массива соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив записывается в элемент с индексом <Index>.
Скаляр добавляется в Матрицу
Скаляр из тэга <Value> преобразуется в массив с длиной соответствующей наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив записывается в элемент с индексом <Index>.
Матрица добавляется в Массив
Берет первый элемент первой строки матрицы, указанной в тэге <Value>, и записывается в элемент с индексом <Index> массива из тэга <Source>.
Массив добавляется в Массив
Берется первый элемент массива из тэга <Value> и записывается в элемент с индексом <Index> массива, указанном в тэге <Source>.