我发现对于我正在排序并尝试查看结果的哈希表,出现了一些看起来非常奇怪的行为。我构建了哈希表,然后需要根据值对该表进行排序,但是我发现了两个奇怪的问题。
在类外部运行正常。
$hash = [hashtable]::New()
$type = 'conformset'
$hash.Add($type, 1)
$type = 'applyset'
$hash.Add($type , 1)
$type = 'conformset'
$hash.$type ++
$hash.$type ++
$hash
Write-Host
$hash = $hash.GetEnumerator() | Sort-Object -property:Value
$hash
我看到哈希表的内容两次,一次是未排序的,另一次是排序后的。然而,当使用类时,它什么也不做。
class Test {
# Constructor (abstract class)
Test () {
$hash = [hashtable]::New()
$type = 'conformset'
$hash.Add($type, 1)
$type = 'applyset'
$hash.Add($type , 1)
$type = 'conformset'
$hash.$type ++
$hash.$type ++
$hash
Write-Host
$hash = $hash.GetEnumerator() | Sort-Object -property:Value
$hash
}
}
[Test]::New()
这只是将“Test”输出到控制台,与哈希表无关。我在这里的假设是它与管道如何中断有关,说实话,这是迁移到类的一个很好的理由,考虑到污染的管道错误是多么常见。因此,采用基于循环的方法,在类中或不在类中都无法显示第二个已排序的哈希表。
$hash = [hashtable]::New()
$type = 'conformset'
$hash.Add($type, 1)
$type = 'applyset'
$hash.Add($type , 1)
$type = 'conformset'
$hash.$type ++
$hash.$type ++
foreach ($key in $hash.Keys) {
Write-Host "$key $($hash.$key)!"
}
Write-Host
$hash = ($hash.GetEnumerator() | Sort-Object -property:Value)
foreach ($key in $hash.Keys) {
Write-Host "$key $($hash.$key)!!"
}
但非常奇怪的是,这只显示了基于循环的输出的第一个,而两个直接转储都显示出来。
$hash = [hashtable]::New()
$type = 'conformset'
$hash.Add($type, 1)
$type = 'applyset'
$hash.Add($type , 1)
$type = 'conformset'
$hash.$type ++
$hash.$type ++
foreach ($key in $hash.Keys) {
Write-Host "$key $($hash.$key)!"
}
$hash
Write-Host
$hash = ($hash.GetEnumerator() | Sort-Object -property:Value)
foreach ($key in $hash.Keys) {
Write-Host "$key $($hash.$key)!!"
}
$hash
现在的输出结果为:
conformset 3!
applyset 1!
Name Value
---- -----
conformset 3
applyset 1
applyset 1
conformset 3
很明显,$hash被排序了。但是循环不会显示它?这是有缺陷的行为,还是我没有理解这种行为的原因,因此没有解决方案?
SortedList<TKey,TValue> Class (System.Collections.Generic) | Microsoft Docs — https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.sortedlist-2?view=netframework-4.8
<<< - Lee_Dailey