我有以下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
答案 0 :(得分:12)
我在Windows XP上的PowerShell V2 CTP上测试了这个,并看到了与OP相同的结果。
问题似乎是PowerShell在收集管道时传递“扁平化”的习惯。一个简单的解决方案是通过使用逗号运算符为返回的表达式添加表达式来将返回值包装在集合中:
return ,$factorPairs
有关详细信息,请参阅Keith Hill的博客文章Effective PowerShell Item 8: Output Cardinality - Scalars, Collections and Empty Sets - Oh My!。
希望这有帮助。
答案 1 :(得分:5)
你很亲密。您遇到的问题是PowerShell在从函数返回数组时展开(展平)数组。使用逗号运算符按原样返回数组而不展开它:
return ,$factorPairs
当数组中只有一个元素时,输入1,2,3和其他素数就是这种情况,PowerShell会将数组的内容展开到输出中,因此每个元素(1,1)都会出现在输出中。为什么PowerShell在这种情况下展开外部和内部数组 - 我不确定。我怀疑他们这样做是因为有些人会从PowerShell中得到这种行为。