#arrays #powershell #hash
#массивы #powershell #хэш
Вопрос:
я хочу иметь быстрый доступ к сложным данным, и я хотел бы организовать их в виде хэша массивов хэшей.
Я немного не уверен, поскольку хэши похожи на массивы: как мне определить это безопасным способом?
Замечание: сначала я подумал, что простой хэш хэшей, но все функции shoes не являются индивидуальными и могут вызвать столкновение ключей, поэтому я начал думать о массиве наиболее релевантных функций.
1) «Внешние» ключи — это [строковые] имена элементов (имена обуви),
2) затем я хочу иметь массив [одиночных] чисел (например, размер обуви) и
3) «за» каждым числом в массиве мне нужен хэш с более подробной информацией оэта обувь: @{«Цвет»= «Белый»; «Материал»= «Кожа»; …}
Таким образом, я могу легко прокручивать:
$item = @{
"Shoe1 = @() # an array of sizes of that shoe-name
"Shoe2 = @() # an array of sizes of that shoe-name
}
итак, $item.Shoe1 должен быть массивом его размеров:
foreach($size in $item.Shoe1) {
if ( $size -gt 10.5 -or $size -lt 10.0 ) { continue }
# how do I access the hash behind the size = an indiv. shoe?
if($size.Color -eq 'white') {...}
}
а) Не могли бы вы предложить другой способ?
б) Как мне определить эту структуру?
c) Как я могу добавить размер с его хэшем «позади» к обуви?
Заранее спасибо! Иди
Комментарии:
1. хорошо, может быть неправильно понято, я изменил свой код.
2. Синтаксис Powershell v4:
$shoeDictionary.Loafer.Where( { $_.Size -eq 6 -and $_.Color -eq "White" } )
Ответ №1:
(Весь ответ пересмотрен на основе комментария 6/20)
Основываясь на вашем отзыве @gooly и перечитывая ваш вопрос, я очищаю весь свой ответ, чтобы дать вам что-то, что должно быть более полезным для вас. Вы правы в том, что хэширование массивов хэшей будет работать, как в этом первом примере. Обратите внимание, что мокасины 6-го размера выпускаются в 3 разных сочетаниях цвета и материала:
$shoeDictionary = @{
Loafer = @(
@{ Size = 6; Color = "White"; Material = "Leather" },
@{ Size = 6; Color = "Brown"; Material = "Faux Leather" },
@{ Size = 6; Color = "Blue"; Material = "Leather" },
@{ Size = 10.5; Color = "Black"; Material = "Patent Leather" }
)
Oxford = @(
@{ Size = 5; Color = "Blue"; Material = "Leather" },
@{ Size = 5.5; Color = "Green"; Material = "Faux Leather" }
)
}
Когда вы запрашиваете размер 6 белым цветом, вам вообще не нужны циклы:
PS> $shoeDictionary.Loafer | Where { $_.Size -eq 6 -and $_.Color -eq "White" }
Name Value
---- -----
Color White
Material Leather
Size 6
Но рассмотрим более широкий вопрос: покажите мне все бездельники 6-го размера, вы получите это:
PS> $shoeDictionary.Loafer | Where Size -eq 6
Name Value
---- -----
Color White
Material Leather
Size 6
Color Brown
Material Faux Leather
Size 6
Color Blue
Material Leather
Size 6
… что не очень разборчиво. Лучший выбор — думать в терминах объектов, а не хэшей, то есть хэшей массивов объектов, а не хэшей массивов хэшей, а именно:
$shoeDictionary = @{
Loafer = @(
(New-Object PSObject -Property @{ Size = 6; Color = "White"; Material = "Leather" }),
(New-Object PSObject -Property @{ Size = 6; Color = "Brown"; Material = "Faux Leather" }),
(New-Object PSObject -Property @{ Size = 6; Color = "Blue"; Material = "Leather" }),
(New-Object PSObject -Property @{ Size = 10.5; Color = "Black"; Material = "Patent Leather" })
)
Oxford = @(
(New-Object PSObject -Property @{ Size = 5; Color = "Blue"; Material = "Leather" }),
(New-Object PSObject -Property @{ Size = 5.5; Color = "Green"; Material = "Faux Leather" })
)
}
Теперь, когда вы смотрите на все бездельники 6-го размера, вы получаете гораздо более приемлемый результат:
PS> $shoeDictionary.Loafer | Where Size -eq 6
Color Material Size
----- -------- ----
White Leather 6
Brown Faux Leather 6
Blue Leather 6
Комментарии:
1. Ну, конечно, я бы тоже предпочел «простой» хэш хэшей хэшей! Но как только у вас есть два или более ботинок одинакового размера, эта структура становится еще более сложной, поскольку вы должны выполнить add. администратор. работайте над тем, чтобы убедиться, что все блоки остаются в этом хэше и не «перезаписываются» следующим. Список разных ключей идеально подходит для хэша, но список, вероятно, одинаковых значений было бы проще организовать в массиве — нет?
2. @gooly: смотрите Мой полностью пересмотренный ответ выше.