2013-08-01 6 views
9

ハッシュテーブルのソートに問題があります。私は元のスクリプトで誰かを圧倒しないように、必需品を裸にするために自分のコードを分解しました。値のプロパティでPowerShellハッシュテーブルをソート

Write-Host "PowerShell Version = " ([string]$psversiontable.psversion) 
$h = @{} 
$Value = @{SortOrder=1;v1=1;} 
$h.Add(1, $Value) 
$Value = @{SortOrder=2;v1=1;} 
$h.Add(2, $Value) 
$Value = @{SortOrder=3;v1=1;} 
$h.Add(3, $Value) 
$Value = @{SortOrder=4;v1=1;} 
$h.Add(4, $Value) 

Write-Host "Ascending" 
foreach($f in $h.GetEnumerator() | Sort-Object Value.SortOrder) 
{ 
    Write-Host $f.Value.SortOrder 
} 

Write-Host "Descending" 
foreach($f in $h.GetEnumerator() | Sort-Object Value.SortOrder -descending) 
{ 
    Write-Host $f.Value.SortOrder 
} 

出力は、私は、これはSort-Objectの正しい使い方を知らないだけの単純なケースであると確信して

PowerShell Version = 3.0 
Ascending 
2 
1 
4 
3 
Descending 
2 
1 
4 
3 

です。ソートはSort-Object Nameで正しく動作するので、Value.SortOrderの処理方法がわからない場合はどうなるのでしょうか?

答えて

19

Sort-Objectは、ソートに使用されるプロパティ名またはスクリプトブロックを受け入れます。あなたはスクリプトブロックを使用する必要があります、プロパティのプロパティでソートしようとしているので:

Write-Host "Ascending" 
$h.GetEnumerator() | 
    Sort-Object { $_.Value.SortOrder } | 
    ForEach-Object { Write-Host $_.Value.SortOrder } 

Write-Host "Descending" 
$h.GetEnumerator() | 
    Sort-Object { $_.Value.SortOrder } -Descending | 
    ForEach-Object { Write-Host $_.Value.SortOrder } 

あなたはWhere-Objectコマンドレットを使用してフィルタリングすることができます。

Write-Host "Ascending" 
$h.GetEnumerator() | 
    Where-Object { $_.Name -ge 2 } | 
    Sort-Object { $_.Value.SortOrder } | 
    ForEach-Object { Write-Host $_.Value.SortOrder } 

あなたは通常したいです並べ替えを高速化するので、Where-Objectの前にのいずれかのSort-Objectコマンドレットを挿入します。

+0

私が質問したコードを使用するように更新しましたが、同じ出力が得られます。 –

+0

私は期間を逃したように見えます。質問をオリジナルに戻して編集し直します。 –

+0

btwこれは別の質問かもしれませんが、> = 2やその他のフィルタを使うのは簡単な方法です。 –

2

ファイル名の単語の出現をカウントするために、頻度テーブルとしてハッシュテーブルを使用していました。

$words = @{} 
get-childitem *.pdf | foreach-object -process { 
    $name = $_.name.substring($_.name.indexof("-") + 1, $_.name.indexof(".") - $_.name.indexof("-") - 1) 
    $name = $name.replace("_", " ") 
    $word = $name.split(" ")[0] 
    if ($words.contains($word)){ 
     $words[$word] = $words[$word] + 1 
    }else{ 
     $words.add($word, 1) 
    } 
} 
$words.getenumerator() | sort-object -property value 

これは、魔法を行う最後の行で、ハッシュテーブルを値(頻度)でソートします。

+0

それは素晴らしい答えです。私は数時間の間突っ込んできたし、非常に多くの複雑な答えを見たが、これは完璧に働く。よくやった!私はハッシュテーブルでソートが必要でしたが、$ hashtable = {あなたが書いたもの}を置くのは簡単なことでした。本当にありがとう。 – Alan

関連する問題