У Powershell есть функция агрегации/уменьшения?

Я понимаю, что есть связанные вопросы, но все ответы, похоже, являются обходными ситуациями, которые не учитывают сути дела. Имеет ли powershell операцию, которая может использовать скриптовый блок для объединения элементов массива в одно значение? Это то, что известно на других языках как aggregate или reduce или fold.

Я могу написать это сам довольно легко, но, учитывая, что это базовая операция любой обработки списка, я бы предположил, что что-то построенное, о котором я просто не знаю.

Так что я ищу что-то вроде этого

1..10 | Aggregate-Array {param($memo, $x); $memo * $x}

Ответы

Ответ 1

Нет ничего такого явно называемого "Уменьшить-объект", но вы можете достичь своей цели с помощью Foreach-Object:

1..10 | Foreach {$total=1} {$total *= $_} {$total}

BTW также не является объединением-объектом для объединения двух последовательностей данных на основе некоторого свойства соответствия.

Ответ 2

Это то, что я хотел начать некоторое время. Увидев этот вопрос, просто написал утилиту pslinq (https://github.com/manojlds/pslinq). Первым и единственным командлетом на данный момент является Aggregate-List, который можно использовать, как показано ниже:

1..10 | Aggregate-List { $acc * $input } -seed 1
#3628800

Сумма:

1..10 | Aggregate-List { $acc + $input }
#55

Реверс строки:

"abcdefg" -split '' | Aggregate-List { $input + $acc }
#gfedcba

PS: Это скорее эксперимент

Ответ 3

Если вам нужны максимальные, минимальные, суммарные или средние значения, вы можете использовать Measure-Object, к сожалению, он не обрабатывает какой-либо другой агрегированный метод.

Get-ChildItem | Measure-Object -Property Length -Minimum -Maximum -Average