Я собирался задать аналогичный вопрос, а именно: «Как вы предотвращаете развертывание / объединение / объединение массивов PowerShell?».
Что я обнаружил, так это то, что интерактивный интерпретатор делает дополнительный шаг, развернув до , и выводит результаты в консоли:
Например
> (1, 2), (3, 4)
1
2
3
4
Что означает, что он уже был развернут один раз:
[ 1, 2 ] ++ [ 3, 4 ] == [ 1, 2, 3, 4 ]
Следовательно, то, что печатает переводчик, не обязательно для real вывода кода.
Например, следующий код
1, 2, 3 | ForEach-Object { $_, ($_ * 2) }
берет первые три целых числа и дает нам список из двух чисел [ x, x * 2 ]
для каждого. Результат:
[ 1, 2, 2, 4, 3, 6 ]
Однако я хотел следующий вывод:
[ [ 1, 2 ], [ 2, 4 ], [ 3, 6 ] ]
Я использовал оператор запятой ,
, как предложил Кит Хилл:
$list = 1, 2, 3 | ForEach-Object { , ($_, ($_ * 2)) }
Так как мы возвращаем массив, массив, int для каждого входа:
1 -> [ [ 1, 2 ] ]
2 -> [ [ 2, 4 ] ]
3 -> [ [ 3, 6 ] ]
Мы ожидаем, что он будет развернут только один раз, так что $list
будет равен:
[ [ 1, 2 ] ] + [ [ 2, 4 ] ] + [ [ 3, 6 ] ] == [ [ 1, 2 ], [ 2, 4 ], [ 3, 6 ] ]
И мы можем проверить, что это
> $list[0] # get first element of list, should be [ 1, 2 ]
1
2
> $list[2][1] # from the third elem, [ 3, 6 ], get 2nd elem, should be 6
6
Однако, когда переводчик печатает список, он развертывает его еще раз:
[ 1, 2 ] ++ [ 2, 4 ] ++ [ 3, 6 ] == [ 1, 2, 2, 4, 3, 6 ]
так мы получаем
> $list
# prints [ 1, 2, 2, 4, 3, 6 ]