使用PowerShell在声明时初始化字典

本文关键字:初始化 字典 声明 PowerShell 使用 | 更新日期: 2023-09-27 18:03:00

给定这个powershell代码:

$drivers = New-Object 'System.Collections.Generic.Dictionary[String,String]'
$drivers.Add("nitrous","vx")
$drivers.Add("directx","vd")
$drivers.Add("openGL","vo")

是否可以直接初始化这个字典而不必调用Add方法?就像。net允许你做的那样?

像这样?

$foo = New-Object 'System.Collections.Generic.Dictionary[String,String]'{{"a","Alley"},{"b" "bat"}}

使用PowerShell在声明时初始化字典

No。Dictionary<TKey,TValue>的初始化语法是c#语法糖。Powershell对System.Collections.HashTable (@{})有自己的初始化语法支持:

$drivers = @{"nitrous"="vx"; "directx"="vd"; "openGL"="vo"};

对于[可能]几乎所有的情况,它将像Dictionary<TKey,TValue>一样工作。如果出于某种原因,您确实需要Dictionary<TKey,TValue>,则可以创建一个函数,该函数接受HashTable,并遍历键和值,将它们添加到新的Dictionary<TKey,TValue>中。


c#的初始化语法并不是完全"直接"的。编译器从中生成对Add()的调用。
$d = [System.Collections.Generic.Dictionary[String,Object]]::new()
#works now.
$d.Add('keyvalue',  @{x=1; y='abc'})
#Evaluate dictionary
$d
<# outputs
Key      Value 
---      ----- 
keyvalue {y, x}
#>
#evalueate contains key:
$d.Keys.Contains('keyvalue')
<# outputs
True
#>
# Evaluate the value using the key
$d['keyvalue']
<# outputs
Name                           Value                                                                                                                                                          
----                           -----                                                                                                                                                          
y                              abc                                                                                                                                                            
x                              1                                                                                                                                                              
#>
#Evaluate the y property of the object
 $d['keyvalue'].y
<# outputs
abc
#>
# Evaluate the x property of the object
$d['keyvalue'].x
<# outputs
1
#>