Как получить хеш-ключ таблицы, который имеет конкретное значение?

У меня есть хеш-таблица, в которой используются ключи в зависимости от значения.

Например,

    [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

и т.д.