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.

Другие вопросы по тегам