Eri*_*ver 8 .net arrays 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
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试,它的输出显示了问题.您可以看到第一个示例(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
Run Code Online (Sandbox Code Playgroud)
Dan*_*ard 12
我在Windows XP上的PowerShell V2 CTP上测试了这个,并看到了与OP相同的结果.
问题似乎是PowerShell在收集管道时传递"扁平"集合的习惯.一个简单的解决方案是通过使用逗号运算符为要返回的表达式添加表达式来将返回值包装在集合中:
return ,$factorPairs
Run Code Online (Sandbox Code Playgroud)
请参阅Keith Hill的博客文章Effective PowerShell第8项:输出基数 - 标量,集合和空集 - 哦,我的!更多细节.
希望这可以帮助.
你很亲密 您遇到的问题是PowerShell在从函数返回数组时展开(展平)数组.使用逗号运算符按原样返回数组而不展开它:
return ,$factorPairs
Run Code Online (Sandbox Code Playgroud)
当数组中只有一个元素(输入1,2,3和其他素数的情况)时,PowerShell会将数组的内容展开到输出中,因此每个元素(1,1)都会出现在输出中.为什么PowerShell在这种情况下展开外部和内部数组 - 我不确定.我怀疑他们这样做是因为有些人会期望PowerShell会出现这种行为.