2009-09-07 2 views
8

1 제외한 모든 입력에 대해 잘 작동하는 다음 PowerShell 함수가 있습니다. 1 입력을 전달하면 두 요소가 (1,1) 인 배열 인 단일 요소 대신 1,1이라는 두 요소가있는 배열이 반환됩니다.지그재그 PowerShell 배열 하나의 요소가있을 때 차원을 잃고있다

어떻게하면 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 

답변

12

Windows XP의 PowerShell V2 CTP에서이를 테스트하여 OP와 같은 결과를 얻었습니다.

이 문제는 PowerShell이 ​​파이프 라인을 통과 할 때 컬렉션을 "병합"하는 습관 인 것으로 나타났습니다. 간단한 해결책은 따라서 쉼표 연산자로 반환하는 식을 앞에 추가하여 컬렉션의 반환 값을 래핑하는 것입니다 :

return ,$factorPairs 

페이지의 키스 힐의 블로그 좀 더 세부 사항에 대한 항목 Effective PowerShell Item 8: Output Cardinality - Scalars, Collections and Empty Sets - Oh My!.

희망이 도움이됩니다.

+0

멋진 워크 랩과 훌륭한 링크로, PowerShell v3에서 버그가 수정 된 것 같습니다 (https://connect.microsoft.com/feedback/ViewFeedback.aspx?Feedback=281908&SiteID=99). –

5

가까이 있습니다. PowerShell이 ​​함수에서 반환 될 때 배열을 언 롤링 (평평하게 배열)한다는 문제가 있습니다. 그대로를 줄이기 않고 배열을 반환 콤마 연산자를 사용

return ,$factorPairs 

를 입력 1,2,3 등 소수의 경우는 어레이에서 단 하나의 요소가있을 때 파워 쉘이 펼쳐진다 출력에 각 요소 (1,1)이 표시되도록 배열 내용을 출력에 표시합니다. 이 경우 PowerShell이 ​​외부 배열과 내부 배열을 모두 언 롤링하는 이유 - 확실하지 않습니다. 나는 사람들이 PowerShell에서이 동작을 기대할 수있는 시나리오가 있기 때문에 그들이 그것을한다고 생각합니다.

관련 문제