.net 当仅存在一个元素时,交错PowerShell数组正在丢失维度
我有以下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
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中