将散列-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

它与提供的示例不完全相同,但直接符合主题,所以我希望它能帮助到这里的人:)