2013-08-01 13 views
9

Mam problem z sortowaniem tabeli mieszania. Zepsułem swój kod do najpotrzebniejszych rzeczy, aby nie przytłoczyć nikogo moim oryginalnym scenariuszem.Sortowanie tabeli mieszania programu PowerShell dla właściwości o wartości

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 
} 

Wyjście jest

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

Jestem pewien, że jest to tylko prosty przypadek nie znając właściwego wykorzystania Sort-Object. Sortowanie działa poprawnie na Sort-Object Name, więc może ma to coś wspólnego z brakiem wiedzy o obsłudze Value.SortOrder?

Odpowiedz

19

Sort-Object przyjmuje nazwę właściwości lub blok skryptu używany do sortowania. Ponieważ starasz się rozwiązać na własność nieruchomości, trzeba użyć bloku skryptu:

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 } 

można filtrować za pomocą Where-Object komandletu:

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

zwykle chcesz put Where-Objectprzed dowolnych apletów poleceń, ponieważ powoduje to szybsze sortowanie.

+0

Zaktualizowałem moje pytanie, aby użyć kodu, o którym wspomniałeś, ale nadal otrzymuję ten sam wynik. –

+0

nevermind wygląda na to, że przegapiłem okres. Ponownie edytuję pytanie z powrotem do oryginału. –

+0

btw to może być oddzielne pytanie, ale czy istnieje łatwy sposób na> = 2 lub jakiś inny filtr. –

2

Używałem tabeli mieszania jako tabeli częstotliwości, aby policzyć występowanie słów w nazwach plików.

$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 

To ostatnia linia, która wykonuje magię, sortując tabelę mieszania na wartości (częstotliwość).

+0

To wspaniała odpowiedź. Wkurzyłem przez kilka godzin i widziałem tak wiele skomplikowanych odpowiedzi, ale to działa idealnie. Dobra robota! Potrzebowałem sortowania w tabeli mieszania, ale łatwo było umieścić $ hashtable = {co napisałeś} i działało świetnie. Dzięki wielkie. – Alan

Powiązane problemy