我碰到了墙,试图获取哈希表的哈希表进行排序。似乎排序的行为正在将哈希表变成其他东西,而我无法遍历新结构。
$mainHashTable = @{}
$mainHashTable.Add('B', @{'one'='B1'; 'two'='B2'; 'three'='B3'})
$mainHashTable.Add('D', @{'one'='D1'; 'two'='D2'; 'three'='D3'})
$mainHashTable.Add('A', @{'one'='A1'; 'two'='A2'; 'three'='A3'})
$mainHashTable.Add('C', @{'one'='C1'; 'two'='C2'; 'three'='C3'})
CLS
$mainHashTable
foreach ($hashtable in $mainHashTable.keys) {
foreach ($itemKey in $mainHashTable.$hashtable.keys) {
Write-Host "$itemKey $($mainHashTable.$hashtable.$itemKey)!"
}
}
Write-Host
$sortedHashTable = $mainHashTable.GetEnumerator() | sort-object -property name
$sortedHashTable
foreach ($hashtable_S in $sortedHashTable.keys) {
foreach ($itemKey_S in $sortedHashTable.$hashtable_S.keys) {
Write-Host "$itemKey_S $($sortedHashTable.$hashtable_S.$itemKey2)!"
}
}
将$mainHashTable
和$sortedHashTable
转储到控制台的两行看起来一切正常。但是第二个循环集什么也没做。我已经试过像这样
$sortedHashTable = [hashtable]($mainHashTable.GetEnumerator() | sort-object -property name)
这只会引发错误
无法转换类型为“ System.Object []”的“ System.Object []”值 键入“ System.Collections.Hashtable”。
那么,有什么方法可以将系统对象转换为哈希表,这样循环结构就可以对排序结果进行处理了?还是我最好学会学习System.Object的结构?并且(从学术上来说),是否有一种方法可以对哈希表进行排序并返回哈希表?
答案 0 :(得分:2)
您当前正在做的是将哈希表分成单独的条目列表(通过.GetEnumerator()
),然后对那个进行排序-这样您最终会得到$sortedHashTable
只是一个key
/ value
对对象数组,按键排序,而不是实际的[hashtable]
。
有没有一种方法可以对哈希表进行排序并返回哈希表?
否-您不能内联“对哈希表进行排序”,因为哈希表不保留任何保证的键顺序。
这里的方法是按以下顺序将条目复制到 ordered 字典中:
$sortedHashTable = [ordered]@{}
# Sort the keys, then insert into our ordered dictionary
foreach($key in $mainHashTable.Keys |Sort-Object){
$sortedHashTable[$key] = $mainHashTable[$key]
}