2013-02-15 8 views
21

Verwenden von Powershell 2.0 Gibt es eine Möglichkeit, die Reihenfolge der Schlüssel in einer Hashtabelle zu erhalten, als sie hinzugefügt wurden? Wie ein Push/Pop-Mechanismus.Powershell Hashtables Schlüssel Bestellung

Beispiel:

$hashtable = @{} 

$hashtable.Add("switzerland","berne") 
$hashtable.Add("germany","berlin") 
$hashtable.Add("spain","madrid") 
$hashtable.Add("italy","rome") 
$hashtable 

Ich möchte den Auftrag erhalten, in dem ich die Elemente der Hash-Tabelle hinzugefügt haben.

Antwort

36

es keine in Lösung in Powershell V1 gebaut/V2, möchten Sie das .NET verwenden System.Collections.Specialized.OrderedDictionary

$order = New-Object System.Collections.Specialized.OrderedDictionary 
$order.Add("switzerland","berne") 
$order.Add("germany","berlin") 


PS>$order 

Name       Value 
----       ----- 
switzerland     berne 
germany      berlin 

In PS V3 können Sie zu gieße [bestellt]:

PS>[ordered]@{"switzerland"="berne";"germany"="berlin"} 

Name       Value 
----       ----- 
switzerland     berne 
germany      berlin 
+0

Danke für die Antworten! Ich kannte die PS v3 [geordert], aber ich muss PS 2.0 verwenden – Phil

6

können Sie ein geordnetes Lexikon nutzen statt: so:

$list = New-Object System.Collections.Specialized.OrderedDictionary 
$list.Add("switzerland","berne") 
$list.Add("germany","berlin") 
$list.Add("spain","madrid") 
$list.Add("italy","rome") 
$list 
0

Die PS1-Methode zum Hinzufügen von Hashtabellenelementen behält die Reihenfolge der Additionen bei. Keine Notwendigkeit, System.Collections.Specialized.OrderedDictionary zu verwenden.

$Hash = New-Object PSObject          
$Hash | Add-Member -MemberType NoteProperty -Name key1 -Value val1 
$Hash | Add-Member -MemberType NoteProperty -Name key2 -Value val2 
$Hash | Add-Member -MemberType NoteProperty -Name key3 -Value val3 
+1

Aber das ist keine Hashtabelle, es ist ein PSCustomObject. Nicht dasselbe, auch wenn Sie die Variable "$ Hash" nennen. ;) Ein OrderedDictionary funktioniert wie eine Hashtable für alle praktischen Zwecke, die ich ausprobiert habe. –

1

Zur Kompatibilität mit älteren Powershell-Versionen Sie dieses Cmdlet interessieren könnten:

Function Order-Keys { 
    param(
     [Parameter(Mandatory = $true, ValueFromPipeline = $true)][HashTable]$HashTable, 
     [Parameter(Mandatory = $false, Position = 1)][ScriptBlock]$Function, 
     [Switch]$Descending 
    ) 
    $Keys = $HashTable.Keys | ForEach {$_}          #Copy HashTable+KeyCollection 
    For ($i = 0; $i -lt $Keys.Count - 1; $i++) { 
     For ($j = $i + 1; $j -lt $Keys.Count; $j++) { 
      $a = $Keys[$i] 
      $b = $Keys[$j] 
      If ($Function -is "ScriptBlock") { 
       $a = $HashTable[$a] | ForEach $Function 
       $b = $HashTable[$b] | ForEach $Function 
      } 
      If ($Descending) {$Swap = $a -lt $b} Else {$Swap = $a -gt $b} 
      If ($Swap) {$Keys[$i], $Keys[$j] = $Keys[$j], $Keys[$i]} 
     } 
    } 
    Return $Keys 
} 

Dieses Cmdlet gibt eine Liste der Schlüssel von der Funktionsdefinition bestellt:

Sortieren nach Name:

$HashTable | Order-Keys | ForEach {Write-Host $_ $HashTable[$_]} 
germany berlin 
italy rome 
spain madrid 
switzerland berne 

Nach Wert sortieren:

$HashTable | Order-Keys {$_} | ForEach {Write-Host $_ $HashTable[$_]} 
germany berlin 
switzerland berne 
spain madrid 
italy rome 

Sie auch zu nisten Hash-Tabellen betrachten könnte:

$HashTable = @{ 
    switzerland = @{Order = 1; Capital = "berne"} 
    germany  = @{Order = 2; Capital = "berlin"} 
    spain  = @{Order = 3; Capital = "madrid"} 
    italy  = @{Order = 4; Capital = "rome"} 
} 

Z.B. Sortierung (gehasht) um propery und den Schlüssel zurückzugeben (Land):

$HashTable | Order-Keys {$_.Order} | ForEach {$_} 

Oder sortieren (absteigend) durch vordefinierte Kapital

$HashTable | Order-Keys {$_.Capital} -Descending | ForEach {$_} 
3

können Sie einen sequenziellen Schlüssel geben, wie Sie Elemente hinzufügen:

$hashtable = @{} 

$hashtable[$hashtable.count][email protected]("switzerland","berne") 
$hashtable[$hashtable.count][email protected]("germany","berlin") 
$hashtable[$hashtable.count][email protected]("spain","madrid") 
$hashtable[$hashtable.count][email protected]("italy","rome") 
$hashtable 

Dann können Sie Elemente nach dem Schlüssel sortiert erhalten:

echo "`nHashtable keeping the order as they were added" 
foreach($item in $hashtable.getEnumerator() | Sort Key) 
{ 
    $item 
} 
Verwandte Themen