Добавление хеш-таблицы в хеш-таблицу - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь добавить хеш-таблицу в хеш-таблицу с помощью powershell.Однако я получаю следующую ошибку:

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'
    }
}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Полезный ответ EBGreen предлагает решение для того, что вы, вероятно, хотели сделать.

В дополнение к объяснению , почему ваш код не удался:

  • Когда вы используете + для «добавления» двух хеш-таблиц, их записи объединены : другими словами:записи RHS добавляются в хеш-таблицу LHS.
    (Технически, новый экземпляр создается с объединенными записями.)

  • Однако - разумнымдизайн - объединение выполняется только в том случае, если в хеш-таблицах нет общих ключей ;в противном случае вы получите сообщение об ошибке с жалобами на дубликаты ключей.
    Если бы этой защиты не было, вы потеряли бы данные, если значения, связанные с дублирующимися записями, отличаются.

Поскольку ваш цикл неоднократно пытался объединить хеш-таблицу с теми же ключами непосредственно в существующую хеш-таблицу, ваша итерация 2-го цикла неизменно заканчивалась неудачей.

Вы можете проверить это проще:

$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 }
0 голосов
/ 05 июня 2018

Я думаю, что вы хотите что-то вроде этого:

$colors = @("black","white","yellow","blue")
$Applications=@{}
Foreach ($i in $colors)
{
    $Applications[$i] = @{
        Colour = $i
        Prod = 'SrvProd05'
        QA   = 'SrvQA02'
        Dev  = 'SrvDev12'
    }
}

Я также укажу, что с Hashtables часто нужно обращаться с защитой.Каждый ключ должен быть уникальным, но значения не должны быть.Вот типичный метод обработки, который:

$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'
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...