2017-01-11 5 views
2

1つのエントリを持つPowerShellのマルチアレイを持っていて、それを並べ替えると、1から3の行数が変更されます。しかし、マルチアレイに複数のエントリがある場合、ソート後の行数は同じです。1つのエントリを持つマルチアレイ

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/sorting-a-2d-array-with-one-row)とコメントと回答にはいくつかの解決策があります。 – arco444

答えて

0

それは1

$ Aの下の数は三つの要素

$a = $a | Sort-Object 
$a.Count 
を持つ配列であるので、それに一つだけの要素を持つマルチアレイで$ Aの上方

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

を理にかなって

+0

はい、なぜマルチアレイを「通常の」配列に変更するのでしょうか?それを並べ替える? 私はそれが配列内の配列をソートすべきだと思います。マルチアレイ内に3つ以上の要素がある場合、ソート後に2つで、6つではありません。 –

+0

ここで問題となっているのは、Sort-Objectで、単一の配列でうまく動作します。 多次元配列の場合は、 $ a |のようなものを実行する必要があります。 Sort-Object @ {式= {$ _ [1]}; Ascending = $ True} | " " $($ _ [1]) " } – crowchirp

+0

しかし、私がそれを並べ替えた後、私は文字列を持ち、再び配列を持たないでしょう。 –

0

申し訳ありませんが、答えの代わりにコメントを追加するには十分な評判がありません。

すべての問題はパイプラインのために起こります。 パイプラインはストリームから結果を収集します。ストリームから、パイプラインがシングルトンかコレクションを返したかどうかは分かりません。したがって、1つの要素を持つ2次元配列は1次元になります。

+0

配列の宣言が間違って記述されています。まだ文字列です。常に答えてください。 :) –

+1

配列の宣言に何が間違っているか説明してください。私が見ることができるように、$ aの型と$ a [0]の型は配列です。だから私たちは実際に2次元の配列を持っています。しかし、pipe(Sort-Object)は実装の特徴のためにこれを破ります。 –

+1

2次元配列です。 $ 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 
関連する問題