2009-09-07 21 views
8

olduğunda Jagged PowerShell dizisi bir boyut kaybediyor 1 dışında herhangi bir giriş için iyi çalışan aşağıdaki PowerShell işlevine sahibim. 1 girişini iletirseniz, kendisi (1,1) iki öğesinden oluşan tek bir öğe yerine, 1,1 iki öğeli bir dizi döndürecektir.Yalnızca bir öğe

Ben kendisini bir dizidir bir eleman ile pürüzlü bir dizi döndürür PowerShell hale nasıl herhangi bir fikir?

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 
} 

İşte benim test olduğunu ve sorunu gösteren çıkış var. İlk örnekte (giriş olarak 1), sadece bir faktör çifti bulunsa bile 2 uzunluğunu döndürdüğünü görebilirsiniz. İkinci örnek (giriş olarak 6) düzgün çalışıyor ve iki faktör çifti bulunan 2 uzunluğunu döndürüyor.

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

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

cevap

12

Bunu Windows XP'de PowerShell V2 CTP'de test ettim ve OP ile aynı sonuçları gördüm.

problem, boru hattı boyunca geçirilen konum olarak "düzleşme" koleksiyonlarından PowerShell en alışkanlığı gibi görünüyor. Basit bir çözüm böylece virgül operatörüyle döndürülecek ifadesini prefacing tarafından koleksiyonunda dönüş değeri sarılmasıdır:

return ,$factorPairs 

Bkz Keith Hill'in günlüğü biraz daha ayrıntı için giriş Effective PowerShell Item 8: Output Cardinality - Scalars, Collections and Empty Sets - Oh My!.

Bu yardımcı olur umarım.

+0

Büyük iş yeri ve harika bağlantı ve hata, PowerShell v3'te olduğu gibi düzeltilmiş gibi görünüyor (https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=281908&SiteID=99) –

5

Siz yakınız. Çalıştığınız sorun, PowerShell işlevden döndürülürken dizinin kaydını (flattens) çözmesidir. -Olduğu gibi geri açılması olmadan dizi dönmek virgül operatörünü kullanın:

return ,$factorPairs 

girişler 1,2,3 ve diğer asal için olduğu dizisinde sadece bir eleman olduğunda, PowerShell unrolls dizinin içeriği çıktıya her elemanın (1,1) çıkması için çıktıya. PowerShell bu durumda hem dış hem de iç diziyi neden kaydeder? - Kesin olarak bilmiyorum. Bunu yaptıklarından şüpheleniyorum çünkü insanların bu davranışı PowerShell'den bekleyeceği senaryolar var.

İlgili konular