Вы создаете хеш-таблицу , записи которой не доступны с позиционными индексами (0
, 1
, ...); вместо того, что вы указываете внутри [...]
, это запись key .
Поэтому для перечисления используйте свойство .Keys
:
$test = @{set01 = '0'; set02 = '1'}
foreach ($key in $test.Keys) {
$key
# To access the entry's *value*, use $test[$key] $test[$key]
}
Результат:
set02
set01
Обратите внимание, что ключи были перечислены в другом порядке, чем они были определены, потому что [hashtable]
экземпляры не гарантируют какой-либо конкретный порядок перечисления.
В PSv3 + вы можете использовать упорядоченную хеш-таблицу , чтобы исправить это, что также позволит вам использовать позиционную индексацию - но учтите, что позиционная индексация затем возвращает запись значений , а не ключи:
$test = [ordered] @{set01 = '0'; set02 = '1'}
for ($i = 0; $i -lt $test.Count; $i++) {
$test[$i]
}
Примечание: хотя вы могли бы использовать $test.Keys[$i]
для доступа к клавишам, как в ответ Дандре , прямое перечисление клавиш с помощью foreach ($key in $test.Keys)
менее многословно и быстрее; единственная веская причина для использования итерации на основе индекса с $test.Keys[$i]
была бы, если бы индекс $i
был не просто переменной helper , а требовался для работы, например, для вывода строки, отражающей оба ключ и его индекс.
Таким образом, приведенное выше дает:
0
1
Обратите внимание, что синтаксис for
не только многословен, он фактически работает хуже, чем foreach
и , если вам нужны явные индексы, используйте foreach
с сгенерированными индексами через оператор диапазона (..
) , который не только быстрее, но и, возможно, более читабелен, чем цикл for
:
$test = [ordered] @{set01 = '0'; set02 = '1'}
foreach ($i in 0..($test.Count-1)) {
$test[$i]
}
Несмотря на то, что он менее эффективен в отношении памяти, поскольку массив индексов должен быть создан как единое целое, это обычно не имеет значения.