15

我在对哈希表进行排序时遇到问题。我已将我的代码分解为仅是必需品,以免用我的原始脚本压倒任何人。

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
}

输出是

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

我敢肯定这只是一个不知道正确用法的简单案例Sort-Object。排序工作正常,Sort-Object Name所以可能与不知道如何处理有关Value.SortOrder

4

2 回答 2

26

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 cmdlet进行过滤:

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

您通常希望放在任何cmdletWhere-Object 之前Sort-Object,因为它可以加快排序速度。

于 2013-08-01T17:39:43.933 回答
4

我使用哈希表作为频率表来计算文件名中单词的出现次数。

$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

最后一行发挥了魔力,根据值(频率)对哈希表进行排序。

于 2017-02-04T19:58:51.287 回答