Поделиться через


10. Хэш-таблицы

Редакционная заметка

Важный

Спецификация языка Windows PowerShell была опубликована в декабре 2012 года и основана на Windows PowerShell 3.0. Эта спецификация не отражает текущее состояние PowerShell. Нет плана обновить эту документацию, чтобы отразить текущее состояние. Эта документация представлена здесь для получения исторической справки.

Документ спецификации доступен в формате Microsoft Word из Центра загрузки Майкрософт: https://www.microsoft.com/download/details.aspx?id=36389. Этот документ Word был преобразован для представления на Microsoft Learn. Во время преобразования некоторые редакционные изменения были внесены в соответствии с форматированием платформы Docs. Исправлены некоторые опечатки и незначительные ошибки.

Синтаксис:

Совет

Нотация ~opt~ в определениях синтаксиса указывает, что лексическая сущность является необязательной в синтаксисе.

hash-literal-expression:
    @{ new-lines~opt~ hash-literal-body~opt~ new-lines~opt~ }

hash-literal-body:
    hash-entry
    hash-literal-body statement-terminators hash-entry

hash-entry:
    key-expression = new-lines~opt~ statement

key-expression:
    simple-name
    unary-expression

statement-terminator:
    ;
    new-line-character

Введение 10.1

Тип Hashtable представляет коллекцию объектов пар ключ/значение , которые поддерживают эффективное извлечение значения при индексировании по ключу. Каждая пара "ключ-значение" — это элемент , который хранится в определенном типе объекта реализации.

Ключ элемента не может быть значением NULL. Нет ограничений на тип ключа или значения. Повторяющиеся ключи не поддерживаются.

Учитывая объект пары "ключ-значение", ключ и связанное значение можно получить с помощью свойства экземпляра Key и Value соответственно.

Учитывая один или несколько ключей, доступ к соответствующим значениям можно получить с помощью оператора индексации хеш-таблицы [] (§7.1.4.3).

Все хэш-файлы имеют тип Hashtable (§4.3.3).

Порядок ключей в коллекции, возвращаемой ключами, не указан; однако это тот же порядок, что и связанные значения в коллекции, возвращаемой значениями.

Вот несколько примеров, связанных с хэш-таблицами:

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1.FirstName # designates the key FirstName
$h1["LastName"] # designates the associated value for key LastName
$h1.Keys # gets the collection of keys

Hashtable элементы хранятся в объекте типа DictionaryEntry, а коллекции, возвращаемые ключами и значениями, имеют тип ICollection.

10.2 Создание хеш-таблицы

Hashtable создается с помощью хэш-литерала (§7.1.9) или командлета New-Object. Его можно создать с нуля или несколькими элементами. Свойство Count возвращает текущее число элементов.

10.3. Добавление и удаление элементов Hashtable

Элемент можно добавить в Hashtable, назначив (§7.11.1) значение к несуществующему имени ключа или подстроку (§7.1.4.3), использующее несуществующее имя ключа. Для удаления элемента требуется использование метода Remove. Например

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1.Dept = "Finance" # adds element Finance
$h1["Salaried"] = $false # adds element Salaried
$h1.Remove("Salaried") # removes element Salaried

10.4 Конкатенация хэш-таблиц

Хеш-таблицы можно объединить с помощью операторов + и +=, что приводит к созданию новой Hashtable. Существующие хэштебли не изменяются. Дополнительные сведения см. в §7.7.4.

10.5 Хэш-таблицы в качестве ссылочных типов

Поскольку Hashtable является ссылочным типом, присваивание Hashtable включает в себя неглубокое копирование; то есть переменная ссылается на тот же Hashtable, копия Hashtable не производится. Например

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h2 = $h1
$h1.FirstName = "John" # change key's value in $h1
$h2.FirstName # change is reflected in $h2

10.6 Перечисление по хэш-таблице

Чтобы обработать каждую пару в , используйте свойство ключей , чтобы получить список ключей в виде массива, а затем переберите элементы этого массива, чтобы получить связанное значение с помощью свойства значения или подстрочного индекса, как показано ниже.

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123}
foreach ($e in $h1.Keys) {
   "Key is " + $e + ", Value is " + $h1[$e]
}