将散列-table 添加到散列-table
Adding a hash-table to a hash-table
我正在尝试使用 powershell 将哈希-table 添加到哈希-table。但是,我收到以下错误:
Item has already been added. Key in dictionary: 'Dev' Key being added: 'Dev'
这是我的代码:
$colors = @("black","white","yellow","blue")
$Applications=@{}
Foreach ($i in $colors)
{
$Applications += @{
Colour = $i
Prod = 'SrvProd05'
QA = 'SrvQA02'
Dev = 'SrvDev12'
}
}
我做错了什么?
我想你想要的更像这样:
$colors = @("black","white","yellow","blue")
$Applications=@{}
Foreach ($i in $colors)
{
$Applications[$i] = @{
Colour = $i
Prod = 'SrvProd05'
QA = 'SrvQA02'
Dev = 'SrvDev12'
}
}
我还要指出,哈希表通常需要进行防御性处理。每个键必须是唯一的,但值不需要是唯一的。这是典型的处理方法:
$colors = @("black","white","yellow","blue")
$Applications=@{}
Foreach ($i in $colors)
{
if($Applications.ContainsKey($i)){
#Do things here if there is already an entry for this key
}else{
$Applications[$i] = @{
Colour = $i
Prod = 'SrvProd05'
QA = 'SrvQA02'
Dev = 'SrvDev12'
}
}
}
为您可能想要 做的事情提供了解决方案。
通过解释 为什么您的代码失败:
当你使用+
到"add"两个哈希表时,它们的条目是merged:换句话说:RHS 的条目被添加到 LHS 哈希表中。
(从技术上讲,新实例 是用合并的条目创建的。)
但是 - 通过合理的设计 - 合并仅在哈希表没有共同的键时执行;否则,您将收到您看到的错误消息,抱怨重复键。
如果没有此保护措施,如果与重复条目关联的值不同,您将丢失数据。
由于您的循环反复 尝试将具有相同键的哈希表直接合并到现有哈希表中,您的第二次循环迭代总是失败。
你可以更简单地验证一下:
$Applications = @{} # create empty hashtable.
# Merge a hashtable literal into $Applications.
# This works fine, because the two hashtables have no keys in common.
$Applications += @{ first = 1; second = 2 }
# $Application now contains the following: @{ first = 1; second = 2 }
# If you now try to add a hashtable with the same set of keys again,
# the operation invariably fails due to duplicate keys.
$Applications += @{ first = 10; second = 20 } # FAILS
# By contrast, adding a hashtable with unique keys works fine:
$Applications += @{ third = 3; fourth = 4 } # OK
# $Application now contains: @{ first = 1; second = 2; third = 3; fourth = 4 }
我一直在寻找一种方法来执行某种“枚举列表”,因为我对 PowerShell 还很陌生,所以我唯一能想到的就是“哈希表的哈希表!”。
无法找到“内联”完成所有操作的方法,并且我遇到了一些“无法将空键添加到哈希表”的错误。经过一些实验,我最终得到了这个,完全按照我想要的方式工作:
$Enums = @{}
$Enums.Frequency = @{
Daily = "daily"
Weekly = "weekly"
Monthly = "monthly"
}
$Enums.SomethinElse = @{
Thing1 = "dflskdjf"
Thing2 = 12
Thing3 = $null
}
之后就可以简单的使用了
$Enums.SomethinElse.Thing2
或(如果将其添加到全局变量)
$Global:Enums.Frequency.Daily
它与提供的示例不完全相同,但直接符合主题,所以我希望它能帮助到这里的人:)
我正在尝试使用 powershell 将哈希-table 添加到哈希-table。但是,我收到以下错误:
Item has already been added. Key in dictionary: 'Dev' Key being added: 'Dev'
这是我的代码:
$colors = @("black","white","yellow","blue")
$Applications=@{}
Foreach ($i in $colors)
{
$Applications += @{
Colour = $i
Prod = 'SrvProd05'
QA = 'SrvQA02'
Dev = 'SrvDev12'
}
}
我做错了什么?
我想你想要的更像这样:
$colors = @("black","white","yellow","blue")
$Applications=@{}
Foreach ($i in $colors)
{
$Applications[$i] = @{
Colour = $i
Prod = 'SrvProd05'
QA = 'SrvQA02'
Dev = 'SrvDev12'
}
}
我还要指出,哈希表通常需要进行防御性处理。每个键必须是唯一的,但值不需要是唯一的。这是典型的处理方法:
$colors = @("black","white","yellow","blue")
$Applications=@{}
Foreach ($i in $colors)
{
if($Applications.ContainsKey($i)){
#Do things here if there is already an entry for this key
}else{
$Applications[$i] = @{
Colour = $i
Prod = 'SrvProd05'
QA = 'SrvQA02'
Dev = 'SrvDev12'
}
}
}
通过解释 为什么您的代码失败:
当你使用
+
到"add"两个哈希表时,它们的条目是merged:换句话说:RHS 的条目被添加到 LHS 哈希表中。
(从技术上讲,新实例 是用合并的条目创建的。)但是 - 通过合理的设计 - 合并仅在哈希表没有共同的键时执行;否则,您将收到您看到的错误消息,抱怨重复键。
如果没有此保护措施,如果与重复条目关联的值不同,您将丢失数据。
由于您的循环反复 尝试将具有相同键的哈希表直接合并到现有哈希表中,您的第二次循环迭代总是失败。
你可以更简单地验证一下:
$Applications = @{} # create empty hashtable.
# Merge a hashtable literal into $Applications.
# This works fine, because the two hashtables have no keys in common.
$Applications += @{ first = 1; second = 2 }
# $Application now contains the following: @{ first = 1; second = 2 }
# If you now try to add a hashtable with the same set of keys again,
# the operation invariably fails due to duplicate keys.
$Applications += @{ first = 10; second = 20 } # FAILS
# By contrast, adding a hashtable with unique keys works fine:
$Applications += @{ third = 3; fourth = 4 } # OK
# $Application now contains: @{ first = 1; second = 2; third = 3; fourth = 4 }
我一直在寻找一种方法来执行某种“枚举列表”,因为我对 PowerShell 还很陌生,所以我唯一能想到的就是“哈希表的哈希表!”。
无法找到“内联”完成所有操作的方法,并且我遇到了一些“无法将空键添加到哈希表”的错误。经过一些实验,我最终得到了这个,完全按照我想要的方式工作:
$Enums = @{}
$Enums.Frequency = @{
Daily = "daily"
Weekly = "weekly"
Monthly = "monthly"
}
$Enums.SomethinElse = @{
Thing1 = "dflskdjf"
Thing2 = 12
Thing3 = $null
}
之后就可以简单的使用了
$Enums.SomethinElse.Thing2
或(如果将其添加到全局变量)
$Global:Enums.Frequency.Daily
它与提供的示例不完全相同,但直接符合主题,所以我希望它能帮助到这里的人:)