gpt4 book ai didi

Powershell 排序哈希表

转载 作者:行者123 更新时间:2023-12-03 00:32:14 25 4
gpt4 key购买 nike

我在排序哈希表时发现一些看似非常奇怪的行为,然后尝试查看结果。我构建了哈希表,然后我需要根据值对该表进行排序,我看到了两个奇怪的地方。

这在类外工作得很好

$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 正在排序。但是循环不会显示它?嗯?这是错误的行为,还是我只是不明白其原因的预期行为,因此如何解决?

最佳答案

  • Vasil Svilenov Nikolov's helpful answer解释了您的方法的根本问题:

    • 从根本上说,您无法通过键对哈希表([hashtable] 实例)进行排序:无法保证哈希表中键的顺序,也无法更改。

    • 什么 $hash = $hash.GetEnumerator() | Sort-Object -property:Value 的作用是创建一个 [System.Collections.DictionaryEntry] 实例数组;结果数组没有 .Keys 属性,因此永远不会进入第二个 foreach ($key in $hash.Keys) 循环。

  • 一个不相关的问题是您通常不能隐式从 PowerShell 写入输出流:

    • 从类方法写入输出流需要显式使用return;同样,必须通过 Throw 语句报告错误。
    • 在您的例子中,代码位于类 Test构造函数中,并且构造函数隐式返回新构造的实例 - 您不允许返回 他们的任何东西。

要解决您的问题,您需要一种专门的数据类型,它结合了散列表的功能并按排序维护条目键。[1 ]

.NET 类型 System.Collections.SortedList提供此功能(还有一个 generic version ,如 Lee Dailey 注释):

您可以使用该类型开始:

# Create a SortedList instance, which will maintain
# the keys in sorted order, as entries are being added.
$sortedHash = [System.Collections.SortedList]::new()

$type = 'conformset'
$sortedHash.Add($type, 1) # Or: $sortedHash[$type] = 1 or: $sortedHash.$type = 1
$type = 'applyset'
$sortedHash.Add($type , 1)
$type = 'conformset'
$sortedHash.$type++
$sortedHash.$type++

或者甚至从现有哈希表转换(和转换为):

# Construct the hash table as before...
$hash = [hashtable]::new() # Or: $hash = @{}
$type = 'conformset'
$hash.Add($type, 1)
$type = 'applyset'
$hash.Add($type , 1)
$type = 'conformset'
$hash.$type++
$hash.$type++

# ... and then convert it to a SortedList instance with sorted keys.
$hash = [System.Collections.SortedList] $hash

[1] 请注意,这与 ordered 字典不同,后者是 PowerShell 使用文字语法 [ordered] @{ ... } 提供的:有序字典按插入的顺序维护键,而不是基于排序。有序字典的类型为 System.Collections.Specialized.OrderedDictionary

关于Powershell 排序哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59498570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com