2009-09-07 29 views
8

Tôi có chức năng PowerShell sau hoạt động tốt cho mọi đầu vào ngoại trừ 1. Nếu tôi vượt qua nó một đầu vào của 1 nó sẽ trả về một mảng với hai yếu tố 1,1 thay vì một phần tử duy nhất mà chính nó là một mảng của hai yếu tố (1,1).Mảng chữ cái bị lởm chởm bị mất kích thước khi chỉ có một phần tử tồn tại

Bất kỳ ý tưởng nào về cách tôi có thể làm cho PowerShell trả về một mảng có răng cưa với một phần tử tự nó là một mảng?

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 
} 

Đây là thử nghiệm của tôi và đầu ra của nó hiển thị sự cố. Bạn có thể thấy ví dụ đầu tiên (1 là đầu vào) đang trả về độ dài là 2 mặc dù chỉ có một cặp yếu tố được tìm thấy. Ví dụ thứ hai (6 là đầu vào) đang hoạt động đúng và đang trả về độ dài 2 với hai cặp nhân tố được tìm thấy.

~» (getFactorPairs 1).length 
    DEBUG: Factor Pair: 1, 1 
    2 

~» (getFactorPairs 6).length 
    DEBUG: Factor Pair: 1, 6 
    DEBUG: Factor Pair: 2, 3 
    2 

Trả lời

12

Tôi đã thử nghiệm điều này trên PowerShell V2 CTP trên Windows XP và thấy kết quả tương tự như OP.

Sự cố dường như là thói quen của bộ sưu tập "làm phẳng" của PowerShell khi chúng được truyền dọc theo đường ống. Một giải pháp đơn giản là quấn giá trị trả về trong một bộ sưu tập của prefacing biểu thức để được trả lại với các nhà điều hành dấu phẩy như sau:

return ,$factorPairs 

Xem Keith Hill blog entry Effective PowerShell Item 8: Output Cardinality - Scalars, Collections and Empty Sets - Oh My! cho một chi tiết nhỏ hơn.

Hy vọng điều này sẽ hữu ích.

+0

Great workround và liên kết tuyệt vời và lỗi dường như đã được khắc phục (https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=281908&SiteID=99) có lẽ trong PowerShell v3 –

5

Bạn đang đóng cửa. Vấn đề bạn đang chạy là PowerShell unrolls (flattens) mảng khi nó được trả về từ hàm. Sử dụng toán tử dấu phẩy để trở mảng như nó vốn có mà không unrolling nó:

return ,$factorPairs 

Khi chỉ có một phần tử trong mảng, đó là trường hợp cho các đầu vào 1,2,3 và số nguyên tố khác, PowerShell unrolls các nội dung của mảng vào đầu ra sao cho mỗi phần tử (1,1) xuất hiện trên đầu ra. Tại sao PowerShell unrolls cả mảng bên ngoài và bên trong trong trường hợp này - tôi không biết chắc chắn. Tôi nghi ngờ họ làm điều đó bởi vì có những kịch bản mà folks mong đợi hành vi này từ PowerShell.

Các vấn đề liên quan