PowerShell: хэширование массивов хэшей — ищу совет

#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: смотрите Мой полностью пересмотренный ответ выше.