Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 当仅存在一个元素时,交错PowerShell数组正在丢失维度_.net_Arrays_Powershell - Fatal编程技术网

.net 当仅存在一个元素时,交错PowerShell数组正在丢失维度

.net 当仅存在一个元素时,交错PowerShell数组正在丢失维度,.net,arrays,powershell,.net,Arrays,Powershell,我有以下PowerShell函数,它适用于除1之外的任何输入。如果我向它传递一个1的输入,它将返回一个包含两个元素1,1的数组,而不是一个元素本身就是两个元素的数组(1,1) 有没有办法让PowerShell返回一个锯齿状数组,其中一个元素本身就是数组? function getFactorPairs { param($n) $factorPairs = @() $maxDiv = [math]::sqrt($n) write-verbose "Max Divis

我有以下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  

我在Windows XP上的PowerShell V2 CTP上测试了这一点,并看到了与OP相同的结果

问题似乎在于PowerShell在收集过程中“扁平化”收集的习惯。一个简单的解决方案是通过在要返回的表达式前面加逗号运算符,将返回值包装到集合中,因此:

return ,$factorPairs
更多细节请参见Keith Hill的博客


希望这能有所帮助。

你很接近了。您遇到的问题是,当从函数返回阵列时,PowerShell会展开(展平)阵列。使用逗号运算符按原样返回数组而不展开它:

return ,$factorPairs

当数组中只有一个元素时(输入1、2、3和其他素数就是这种情况),PowerShell会将数组的内容展开到输出中,使每个元素(1、1)显示在输出中。在本例中,为什么PowerShell同时展开外部和内部阵列-我不确定。我怀疑他们这样做是因为在某些情况下,人们会期望PowerShell会出现这种行为。

很好的解决方案和链接,而且该错误似乎已经修复()大概是在PowerShell v3中