Powershell,添加项目以便哈希表
我有以下示例脚本
$aDomains = @{}
$aDomains['a-test.nl'] = @{}
$aDomains['b-test.nl'] = @{}
$aDomains['c-test.nl'] = @{}
$aDomains['d-test.nl'] = @{}
$aDomains['e-test.nl'] = @{}
$aDomains
看起来很简单,但是如果我运行这个脚本,输出是非常出乎意料的:
$aDomains
Name Value
---- -----
e-test.nl {}
d-test.nl {}
b-test.nl {}
a-test.nl {}
c-test.nl {}
如何让输出与添加项目的顺序相匹配?由于脚本中接下来会发生什么,我确实需要在所有实例上使用 @{}。
此外,在脚本中添加它根本没有效果:
$aDomains = $aDomains | Sort-Object
回答
如您所见,默认情况下哈希表没有排序。从 PowerShell 3.0 开始,您可以使哈希表有序,在这种情况下它将保持顺序。
请参阅以下示例:
$aDomains = [ordered] @{}
$aDomains['e-test.nl'] = @{}
$aDomains['a-test.nl'] = @{}
$aDomains['b-test.nl'] = @{}
$aDomains['c-test.nl'] = @{}
$aDomains['d-test.nl'] = @{}
$aDomains['e-test.nl'] = @{}
$aDomains
Name Value
---- -----
e-test.nl {}
a-test.nl {}
b-test.nl {}
c-test.nl {}
d-test.nl {}
如您所见,e-test.nl 在列表中出现了两次,但只在顶部添加了一次,因此它确实与添加的顺序有关,并且不会添加两次。要使其工作,请将[ordered]标记添加到哈希表分配的开头。
虽然小侧节点。如果使用 .ContainsKey() 函数,则需要将其更改为 .Contains()