获取其中只有一个键/值的哈希表的计数

Posted

技术标签:

【中文标题】获取其中只有一个键/值的哈希表的计数【英文标题】:Getting the count of a hashtable that only has one key/value in it 【发布时间】:2021-09-21 18:33:09 【问题描述】:

我有一个 foreach 循环,目前在我的哈希表中放入三个条目:

$result = foreach($key in $serverSpace.Keys)
    if($serverSpace[$key] -lt 80)
        [pscustomobject]@
            Server = $key
            Space = $serverSpace[$key]

当我使用时

$result.count

我按预期得到了 3 个。 我更改了 foreach 循环以排除小于或等于 1 的条目使用

$result = foreach($key in $serverSpace.Keys)
    if($serverSpace[$key] -lt 80 -and $serverSpace[$key] -gt 1)
        [pscustomobject]@
            Server = $key
            Space = $serverSpace[$key]

$result.count 应该有 1 作为其输出,但它不会将 .count 识别为建议的命令,并且 $result.count 不再输出任何内容。我假设当哈希表中只有一个条目时它不允许计数?不确定发生了什么,但我的脚本条件取决于 $result 的计数。任何帮助将不胜感激。

【问题讨论】:

强制为数组:@($result).count [1] PSCO 不是哈希表。 [grin] [2] 如果您希望单个对象具有.Count 属性,则需要将该对象放入一个集合中。最简单的方法是在 $Var 名称前加上 [array] 哦,哇,我很笨。这就说得通了。谢谢你们俩 这能回答你的问题吗? Powershell being too clever 术语说明:foreach 循环返回的是一个或多个自定义对象[pscustomobject] 实例),而不是hashtables。 【参考方案1】:

$result 不是哈希表,所以我在它前面加上了@($result).count。感谢@Theo 和@Lee_Dailey

【讨论】:

【参考方案2】:

您看到的是 Windows PowerShell 中的一个错误(截至最新的和最终版本, 5.1),此后已在 PowerShell (Core) 中更正 - 请参阅 GitHub issue #3671 以获取原始错误报告。

也就是说,从 v3 开始,所有对象都应该有一个intrinsic.Count属性,而不仅仅是集合,这是为了标量和集合的统一处理 - 请参阅 this answer 了解更多信息。

Windows PowerShell解决方法确实是通过@(...) 强制将值设为数组 ,array-subexpression operator,保证具有.Count 属性,如您的答案所示,但它不应该是必需的,实际上在 PowerShell (Core, v6+)

# !! Due to a BUG, this outputs $null in *Windows PowerShell*,
# !! but correctly outputs 1 in PowerShell (Core).
([pscustomobject] @).Count

# Workaround for Windows PowerShell that is effective in *both* editions,
# though potentially wasteful in PowerShell (Core):
@([pscustomobject] @).Count

【讨论】:

以上是关于获取其中只有一个键/值的哈希表的计数的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 JavaScript 哈希表计数? [复制]

哈希表的实现

哈希表的实现

Redis常用命令--Hashes

48 容器——HashMap底层:哈希表结构与哈希算法

数据结构之哈希表