10. 哈希表

编辑说明

重要

Windows PowerShell 语言规范 3.0 于 2012 年 12 月发布,基于 Windows PowerShell 3.0。 此规范不反映 PowerShell 的当前状态。 没有计划更新本文档以反映当前状态。 此处提供了本文档供历史参考。

该规范文档可以从 Microsoft 下载中心以 Microsoft Word 格式下载:https://www.microsoft.com/download/details.aspx?id=36389。在此 Microsoft Learn 上,该 Word 文档已被转换为适合展示的格式。 转换期间,进行了一些编辑更改,以适应 Docs 平台的格式设置。 已更正某些拼写错误和次要错误。

语法:

提示

语法定义中的 ~opt~ 表示法指示词法实体在语法中是可选的。

hash-literal-expression:
    @{ new-lines~opt~ hash-literal-body~opt~ new-lines~opt~ }

hash-literal-body:
    hash-entry
    hash-literal-body statement-terminators hash-entry

hash-entry:
    key-expression = new-lines~opt~ statement

key-expression:
    simple-name
    unary-expression

statement-terminator:
    ;
    new-line-character

10.1 简介

Hashtable 类型表示按键索引时支持有效的值检查的键/值对对象的集合。 每个键/值对都是一个 元素,存储在一些实现定义的对象类型中。

元素的键不能为 null 值。 键或值的类型没有限制。 不支持重复键。

给定键/值对对象后,可以使用实例属性键和值分别获取键和关联值。

给定一个或多个键后,可以通过哈希表下标运算符 []§7.1.4.3)访问相应的值。

所有哈希表都具有类型 Hashtable§4.3.3)。

键返回的集合中的键顺序未指定;但是,它与 Values 返回的集合中的关联值的顺序相同。

下面是涉及哈希表的一些示例:

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1.FirstName # designates the key FirstName
$h1["LastName"] # designates the associated value for key LastName
$h1.Keys # gets the collection of keys

Hashtable 元素存储在类型为 DictionaryEntry的对象中,而键和值返回的集合是 ICollection类型。

10.2 创建哈希表

Hashtable 是通过哈希文本 (§7.1.9) 或 New-Object cmdlet 创建的。 可以使用零个或多个元素创建它。 Count 属性返回当前元素计数。

10.3 添加和删除哈希表元素

通过将值分配 (Hashtable) 给不存在的键名称或使用不存在键名称的下标 (§7.1.4.3),可以将元素添加到 中。 删除元素需要使用 Remove 方法。 例如,

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1.Dept = "Finance" # adds element Finance
$h1["Salaried"] = $false # adds element Salaried
$h1.Remove("Salaried") # removes element Salaried

10.4 哈希表串联

哈希表可以通过 ++= 运算符连接,这两者都会导致创建新的 Hashtable。 现有哈希表保持不变。 有关详细信息,请参阅 §7.7.4

10.5 哈希表作为引用类型

由于 Hashtable 是引用类型,因此对 Hashtable 的赋值涉及浅表副本;也就是说,赋值的变量引用的是同一个 Hashtable,不创建 Hashtable 的副本。 例如,

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h2 = $h1
$h1.FirstName = "John" # change key's value in $h1
$h2.FirstName # change is reflected in $h2

10.6 枚举哈希表

要处理 Hashtable 中的每个对,请使用 Keys 属性检索数组形式的键列表,然后枚举通过 Value 属性或下标获取关联值的该数组的元素。

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123}
foreach ($e in $h1.Keys) {
   "Key is " + $e + ", Value is " + $h1[$e]
}