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

45

给定这段 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"}}

[不确定需要什么类型的语法]

3个回答

80
不行。 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()的调用。


我真的不需要字典。一个.NET哈希表完全可以胜任。 - C.J.
2
值得注意的是,HashTable和Dictionary确实有一些差异,但这些差异在常见的PowerShell脚本中通常被认为不相关。 - Bacon Bits
强类型是我们严格使用字典的一个很好的案例。出于这个原因,我正在尝试将一个属性从哈希表转换为字典。 - Mike

2

对于那些真正喜欢使用字典的人来说。 在我的情况下,我不得不使用另一个带有字典参数的c# dll:

New-Object "System.Collections.Generic.Dictionary[String,String]"

这在2011年可能是不可能的。

我认为应该在 system 前面加上双引号。 - Sasha Bond
@SashaBond 看起来两种方法都可以,我会更新答案,因为在 System 之前放置 " 更有意义。 - Gideon Mulder

0
$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
#>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接