Jagged PowerShell массив теряет измерение, когда существует только один элемент
У меня есть следующая функция PowerShell, которая хорошо работает для любого ввода, кроме 1
, Если я передам это вход 1
вернет массив с двумя элементами 1,1
вместо одного элемента, который сам по себе является массивом из двух элементов (1,1)
,
Любые идеи, как я могу заставить PowerShell возвращать зубчатый массив с одним элементом, который сам является массивом?
function getFactorPairs {
param($n)
$factorPairs = @()
$maxDiv = [math]::sqrt($n)
write-verbose "Max Divisor: $maxDiv"
for($c = 1; $c -le $maxDiv; $c ++) {
$o = $n / $c;
if($o -eq [math]::floor($o)) {
write-debug "Factor Pair: $c, $o"
$factorPairs += ,@($c,$o) # comma tells powershell to add defined array as element in existing array instead of adding array elements to existing array
}
}
return $factorPairs
}
Вот мой тест, и он показывает проблему. Вы можете видеть, что первый пример (1 в качестве входных данных) возвращает длину 2, хотя была найдена только одна пара факторов. Второй пример (6 в качестве входных данных) работает правильно и возвращает длину 2 с двумя найденными парами факторов.
~» (getFactorPairs 1).length
DEBUG: Factor Pair: 1, 1
2
~» (getFactorPairs 6).length
DEBUG: Factor Pair: 1, 6
DEBUG: Factor Pair: 2, 3
2
2 ответа
Я проверил это на PowerShell V2 CTP в Windows XP и увидел те же результаты, что и OP.
Проблема заключается в привычке PowerShell "выравнивать" коллекции, когда они передаются по конвейеру. Простое решение состоит в том, чтобы обернуть возвращаемое значение в коллекцию, предварительно указав выражение, которое будет возвращено с помощью оператора запятой, таким образом:
return ,$factorPairs
См. Запись в блоге Кейта Хилла " Эффективный элемент PowerShell 8: мощность на выходе - скаляры, коллекции и пустые наборы - О, Боже! немного подробнее.
Надеюсь это поможет.
Вы близки. Проблема, с которой вы сталкиваетесь, заключается в том, что PowerShell разворачивает (выравнивает) массив, когда он возвращается из функции. Используйте оператор запятой, чтобы вернуть массив как есть, не разворачивая его:
return ,$factorPairs
Когда в массиве есть только один элемент, как для входных данных 1,2,3 и других простых чисел, PowerShell развертывает содержимое массива в выходные данные, чтобы каждый элемент (1,1) появлялся в выходных данных. Почему PowerShell развертывает как внешний, так и внутренний массив в этом случае - я точно не знаю. Я подозреваю, что они делают это, потому что есть сценарии, где люди ожидают такого поведения от PowerShell.