web-dev-qa-db-ja.com

特定の値を持つハッシュテーブルキーを取得する方法は?

値に基づいてキーが使用されているハッシュテーブルがあります。

例えば.

    $ComponentTobeBuild=@{"ComponentNameX"="True";
                          "ComponentNameXyz"="False";
                          "SomeComponent"="False"}

値がTrueのキーを取得したいです。 (キーをパラメーターとして他のスクリプトに渡します)。

私はそのようにしていましたが、キーがリストされていないため、私が行方不明になっている場所があると思います。

$($ComponentToBuild.Keys) | Where-Object { $_.Value -eq "True" }

Trueと表示されているコンポーネント名を取得する方法は?また、ハッシュテーブルがこの種の作業にとって賢明な選択であるかどうかを知りたいです。ハッシュテーブルは主に値の処理に使用されると思ったからです。

15
Samselvaprabu

こんにちは、これはあなたが望むもののために働くはずです。

$ComponentTobeBuild=@{"ComponentNameX"="Test";
                          "ComponentNameXyz"="False";
                          "SomeComponent"="False"}                    

Foreach ($Key in ($ComponentTobeBuild.GetEnumerator() | Where-Object {$_.Value -eq "Test"}))
{$Key.name}
10
justinf
$ComponentTobeBuild.GetEnumerator() | ? { $_.Value -eq "True" }
19
David Brabant

私はこれが古いことを知っていますが、他の問題の検索でこれを見たので、なぜ列挙子に悩まされるのか疑問に思いました。実際の言語の質問とまったく同じようにコードを作成するだけです。

値が「True」であるすべてのキーを教えてください。

_$ComponentTobeBuild.Keys | ? { $ComponentTobeBuild[$_] -eq 'True'  }
_

一貫性を保つために、@()にカプセル化して、結果が1つしかない場合や配列がない場合でも配列を取得します。

質問者が持っていたソリューションに関しては、問題は_$__が文字列であり、_.Value_がキーの値ではないことです。 Stringには存在しません。比較するには、_$__をキーとしてハッシュテーブルの値を取得する必要があります。

9
Wiz

PowerShellでハッシュテーブルをフィルタリングする際の問題は、キーと値のペアを反復処理できないことです。

コレクションがあるとしましょう:

$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
6
oɔɯǝɹ

また、条件が満たされるすべての要素を返すDictionary.Keys 'Whereメソッドを使用することもできます。その条件は、テストされたキー$_がディクショナリの"True"値に関連していることをアサートするラムダである可能性があります。

$ComponentTobeBuild=@{"ComponentNameX"="True";
                      "ComponentNameXyz"="False";
                      "SomeComponent"="False"}
$ComponentTobeBuild.Keys.Where({$ComponentTobeBuild[$_] -eq "True"})
# -> @("ComponentNameX")
2
nitzel