2017-01-11 74 views
2

如果我在PowerShell中有一個條目的多數陣列,並且我將對數組進行排序,它會將行數從1更改爲3.但是如果我在多陣列中有多個條目,它將停留排序後的行數相同。一個條目的多陣列

PS C:\Users\user> $a = ,("2", "A", "Urs") 

PS C:\Users\user> $a 
2 
A 
Urs 

PS C:\Users\user> $a.Count 
1 

PS C:\Users\user> $a = $a | Sort-Object 

PS C:\Users\user> $a 
2 
A 
Urs 

PS C:\Users\user> $a.Count 
3 

PS C:\Users\user> $a = ,("2", "A", "Urs") 

PS C:\Users\user> $a.Count 
1 

PS C:\Users\user> $a += ,("3", "B", "Max") 

PS C:\Users\user> $a 
2 
A 
Urs 
3 
B 
Max 

PS C:\Users\user> $a.Count 
2 

PS C:\Users\user> $a = $a | Sort-Object 

PS C:\Users\user> $a.Count 
2 
+0

寫得很好的問題,但我投票關閉,因爲它已[已被提問](http://stackoverflow.com/問題/ 40954626 /排序-a-2d-array-with-one-row)並且在評論和回答中有很多解決方案 – arco444

回答

0

按理說

$a = ,("2", "A", "Urs") 
$a.Count 

以上$ a是多陣列只有一個元素在它因此計數1

低於$ a是數組具有三個元素

$a = $a | Sort-Object 
$a.Count 
+0

是的,但是爲什麼它會將多陣列更改爲「正常」陣列,米排序呢? 我認爲它應該對數組中的數組進行排序。如果我在多陣列中有兩個以上的元素,它會在排序後計算兩個,而不是六個。 –

+0

這裏的問題是使用Sort-Object,它對單個數組工作正常。 但是對於一個多維數組,你需要做類似 $ a | Sort-Object @ {Expression = {$ _ [1]}; Ascending = $ True} | %{ 「$($ _ [0]),$($ _ [1])」 } – crowchirp

+0

但我排序後,我會有一個字符串,而不是一個數組了。 –

0

對不起,我沒有足夠的聲望添加評論而不是答案。

您的所有問題都是由於流水線而發生的。 流水線從流中收集其結果。從流中不能分辨出管道是返回一個單例還是一個集合。所以你有一個元素的二維數組變成一維。

+0

數組聲明寫錯了。它仍然是一個字符串。請具體回答一直。 :) –

+1

請你能解釋一下數組聲明有什麼問題嗎?正如我所看到的$ a的類型和$ a [0]的類型是Array。所以我們真的有二維數組。但是管道(Sort-Object)由於其實現的特性而打破了這一點。 –

+1

它是一個二維數組。 您可以使用$ a [0] [0] 對其進行測試,但在對其進行排序後,只能將其排序爲$ a [0] –

0

我已經做了一個錯誤的解決方法,但它的作品...

$newarray = New-Object System.Collections.ArrayList 
$newmultiarray = New-Object System.Collections.ArrayList 
$a = ,("test", "3333", "peter", "peter2") 
$a += ,("rrrr", "8888", "max", "rhzzh") 

$stringlist = $a | Sort-Object @{Expression={$_[0]}; Ascending=$True} | %{ "$($_[0]),$($_[1]),$($_[2]),$($_[3])" } 

$arraymulti =$stringlist -split "[\r\n]" 

foreach ($i in $arraymulti){ 
    $array = $i -split "," 
     foreach ($y in $array){ 
      [void]$newarray.Add($y) 
     } 
    [void]$newmultiarray.Add($newarray) 
    $newarray = New-Object System.Collections.ArrayList 
    } 

$newmultiarray