Как получить хеш-ключ таблицы, который имеет конкретное значение?
У меня есть хеш-таблица, в которой используются ключи в зависимости от значения.
Например,
[email protected]{"ComponentNameX"="True";
"ComponentNameXyz"="False";
"SomeComponent"="False"}
Я хотел бы получить ключи, имеющие значения True. (Я передам ключ другому параметру script как.).
Я так пытался, но я думаю, что некоторые, где я отсутствую, поскольку это не перечисление ключей.
$($ComponentToBuild.Keys) | Where-Object { $_.Value -eq "True" }
Как получить имя компонента, обозначенное как True? Также я хотел бы знать, является ли хэш-таблица разумным выбором для такого рода работ. Потому что я думал, что таблица Хэша будет в основном использоваться для обработки значений.
Ответы
Ответ 1
Привет, это должно работать для вас.
[email protected]{"ComponentNameX"="Test";
"ComponentNameXyz"="False";
"SomeComponent"="False"}
Foreach ($Key in ($ComponentTobeBuild.GetEnumerator() | Where-Object {$_.Value -eq "Test"}))
{$Key.name}
Ответ 2
$ComponentTobeBuild.GetEnumerator() | ? { $_.Value -eq "True" }
Ответ 3
Я знаю, что это старо, но я видел это в поисках другой проблемы и задавался вопросом, почему вы беспокоитесь о Enumerators. Просто создайте код точно как вопрос на реальном языке:
Дайте мне все ключи, где значение "True".
$ComponentTobeBuild.Keys | ? { $ComponentTobeBuild[$_] -eq 'True' }
Для согласованности я бы инкапсулировал это в @()
, чтобы получить массив, даже если есть только один результат или нет.
Что касается решения, которое задал айзер, проблема в том, что $_
является строкой, а .Value
не является значением ключа. Это просто не существует в String. Вы должны получить значение хэш-таблицы с $_
как ключ, чтобы сравнить его.
Ответ 4
Проблема с фильтрацией Hashtables в PowerShell заключается в том, что вы не можете перебирать пары Key-Value.
Скажем, у вас есть коллекция:
$collection = @{
a = 'A';
b = 'B';
c = 'C';
d = 'D';
e = 'E';
...
}
Вы ожидаете, что сможете использовать
$results = $collection | Where-Object { $_.Key -in ('a', 'b', 'd') }
в PowerShell, но это невозможно.
Поэтому вы возвращаетесь к использованию счетчика:
$results = $collection.GetEnumerator() | Where-Object { $_.Key -in ('a', 'b', 'd') }
$results
Name Value
---- -----
d D
b B
a A
Ответ 5
Вы также можете использовать метод Dictionary.Keys
'Where
, который возвращает все элементы, где выполняется условие. Это условие может быть лямбдой, утверждая, что проверенный ключ $_
относится к значению "True"
в словаре.
[email protected]{"ComponentNameX"="True";
"ComponentNameXyz"="False";
"SomeComponent"="False"}
$ComponentTobeBuild.Keys.Where({$ComponentTobeBuild[$_] -eq "True"})
# -> @("ComponentNameX")
Ответ 6
Самый простой (и самый аккуратный) способ, которым я нашел это, заключался в следующем:
$ComponentToBuild.where{$_.Keys -match 'True'}
Тогда получите только те кусочки, которые вам нужны
$ComponentToBuild.where{$_.Keys -match 'True'} | select Field1,Field2,Field99
и т.д.