반응형
해시 테이블 및 키 순서
키가 추가된 대로 해시 테이블에 키 순서를 유지하는 방법이 방법이 있습니까?푸시/팝(push/pop) 메커니즘처럼.
예:
$hashtable = @{}
$hashtable.Add("Switzerland", "Bern")
$hashtable.Add("Spain", "Madrid")
$hashtable.Add("Italy", "Rome")
$hashtable.Add("Germany", "Berlin")
$hashtable
해시 테이블에 요소를 추가한 순서를 유지하려고 합니다.
PowerShell V1/V2에는 내장 솔루션이 없습니다..NET을 사용할 수 있습니다.
$order = New-Object System.Collections.Specialized.OrderedDictionary
$order.Add("Switzerland", "Bern")
$order.Add("Spain", "Madrid")
$order.Add("Italy", "Rome")
$order.Add("Germany", "Berlin")
PS> $order
Name Value
---- -----
Switzerland Bern
Spain Madrid
Italy Rome
Germany Berlin
PowerShell V3에서 [주문] 위치로 캐스팅할 수 있습니다.
PS> [ordered]@{"Switzerland"="Bern"; "Spain"="Madrid"; "Italy"="Rome"; "Germany"="Berlin"}
Name Value
---- -----
Switzerland Bern
Spain Madrid
Italy Rome
Germany Berlin
대신 순서가 지정된 사전을 사용할 수 있습니다.
다음과 같이:
$list = New-Object System.Collections.Specialized.OrderedDictionary
$list.Add("Switzerland", "Bern")
$list.Add("Spain", "Madrid")
$list.Add("Italy", "Rome")
$list.Add("Germany", "Berlin")
$list
요소를 추가할 때 하나의 순차적 키를 지정할 수 있습니다.
$hashtable = @{}
$hashtable[$hashtable.count] = @("Switzerland", "Bern")
$hashtable[$hashtable.count] = @("Spain", "Madrid")
$hashtable[$hashtable.count] = @("Italy", "Rome")
$hashtable[$hashtable.count] = @("Germany", "Berlin")
$hashtable
그런 다음 키를 기준으로 요소를 정렬할 수 있습니다.
echo "`nHashtable keeping the order as they were added"
foreach($item in $hashtable.getEnumerator() | Sort Key)
{
$item
}
여기 저에게 맞는 간단한 일상이 있습니다.
function sortedKeys([hashtable]$ht) {
$out = @()
foreach($k in $ht.keys) {
$out += $k
}
[Array]::sort($out)
return ,$out
}
그리고 그것을 사용하라는 전화.
forEach($k in (& sortedKeys $ht)) {
...
}
이전 PowerShell 버전과의 호환성을 위해 다음 cmdlet을 고려할 수 있습니다.
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
}
이 cmdlet은 함수 정의에 따라 정렬된 키 목록을 반환합니다.
이름별 정렬:
$HashTable | Order-Keys | ForEach {Write-Host $_ $HashTable[$_]}
Germany Berlin
Italy Rome
Spain Madrid
Switzerland Bern
값별 정렬:
$HashTable | Order-Keys {$_} | ForEach {Write-Host $_ $HashTable[$_]}
Germany Berlin
Switzerland Bern
Spain Madrid
Italy Rome
해시 테이블을 중첩하는 것도 고려할 수 있습니다.
$HashTable = @{
Switzerland = @{Order = 1; Capital = "Berne"}
Germany = @{Order = 2; Capital = "Berlin"}
Spain = @{Order = 3; Capital = "Madrid"}
Italy = @{Order = 4; Capital = "Rome"}
}
예: (해시) 주문 속성별로 정렬하고 키(국가)를 반환합니다.
$HashTable | Order-Keys {$_.Order} | ForEach {$_}
또는 사전 정의된 대문자를 기준으로 정렬(하행)합니다.
$HashTable | Order-Keys {$_.Capital} -Descending | ForEach {$_}
PowerShell 1 방법은 해시 테이블 멤버를 추가하여 추가 순서를 유지하는 것입니다.시스템을 사용할 필요가 없습니다.컬렉션.전문화된.순서가 지정된 사전:
$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
function global:sortDictionaryByKey([hashtable]$dictionary)
{
return $dictionary.GetEnumerator() | sort -Property name;
}
언급URL : https://stackoverflow.com/questions/14891044/hashtables-and-key-order
반응형
'programing' 카테고리의 다른 글
SQL에서 LINQ로 도구 (0) | 2023.09.03 |
---|---|
전화기의 터미널에서 실행할 수 있는 네이티브 안드로이드 바이너리를 컴파일하고 싶습니다. (0) | 2023.09.03 |
가져오기-Module Web Administration이 스크립트에서 로드되지 않고 명령줄에서 로드됨 (0) | 2023.09.03 |
레일 위의 루비에서 데이터베이스 트랜잭션 내에 이미 있는지 확인하는 방법은 무엇입니까? (0) | 2023.08.29 |
파이썬: mysqldb를 사용하여 MySQL 테이블을 사전으로 가져오시겠습니까? (0) | 2023.08.29 |