2012-07-06 26 views
7

値に基づいてキーが使用されているハッシュテーブルがあります。特定の値を持つハッシュテーブルキーを取得する方法は?

例:

[email protected]{"ComponentNameX"="True"; 
          "ComponentNameXyz"="False"; 
          "SomeComponent"="False"} 

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

私はそのようにしていましたが、私はキーがリストされていないので、私は行方不明になっています。

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

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

答えて

8

こんにちはこれはあなたが欲しいのはうまくいくはずです。

[email protected]{"ComponentNameX"="Test"; 
          "ComponentNameXyz"="False"; 
          "SomeComponent"="False"}      

Foreach ($Key in ($ComponentTobeBuild.GetEnumerator() | Where-Object {$_.Value -eq "Test"})) 
{$Key.name} 
+0

このスクリプトは値を取得しようとしていますが、実際にはキーを取得しようとしていました。しかし、これを置くことも機能しません。 $ ComponentTobeBuild.Keys | Where-Object {$ _ -eq "True"} – Samselvaprabu

+0

よろしくお願いいたします。コードチェックが変更されました。psが完全なコードをコピーして試してみると、 "$ Key.name}"セクションにコードを入れて、 – justinf

11
$ComponentTobeBuild.GetEnumerator() | ?{ $_.Value -eq "True" } 
6

私は、これは古いですけど、私は他の問題のために私の検索でこれを見て、あなたは列挙子をなぜわざわざ疑問に思いました。実際の言語での質問とまったく同じコードを作成してください:

値が 'True'のすべてのキーを教えてください。

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

一貫性のために私はちょうど1あるいは全く結果があっても@()に配列を取得することをカプセル化します。

質問者は、問題は$_が文字列で、.Valueがそのキーの値ではないということです。これは単にStringには存在しません。あなたはそれを比較するために、キーとして$_とハッシュテーブルの値を取得する必要があります。

+0

が好きな場合は、testの値を持つすべてのキーを別のハッシュテーブルに入れることができます。同じキーを持つ複数のエントリがある場合の動作... –

+0

Powershellの@oɔyouでは、一意でないキーでhastableを作成できません。 – maoizm

+0

@maozim辞書/マップデータ構造を使用しているので、間違ってハッシュテーブルという用語を使用しています質問に。 .netのHashtablesは衝突を起こす可能性があり、リンクされたリストを使用して複数のアイテムを同じハッシュコードの下に格納します。ハッシュテーブルはすべてオブジェクトによる検索に関するものです。辞書は一意のキーを使用します –

3

PowerShellでHashtablesをフィルタする際の問題は、Key-Valueペアを反復処理できないことです。

はあなたがいくつかのコレクションを持っているとしましょう:

$collection = @{ 
    a = 'A'; 
    b = 'B'; 
    c = 'C'; 
    d = 'D'; 
    e = 'E'; 
    ... 
} 

あなたはPowerShellで

$results = $collection | Where-Object { $_.Key -in ('a', 'b', 'd') } 

を使用することができることを期待するが、それは不可能です。

$results = $collection.GetEnumerator() | Where-Object { $_.Key -in ('a', 'b', 'd') } 
$results 

Name       Value 
----       ----- 
d        D 
b        B 
a        A 
+0

誰かが.keysを他のコレクションのように繰り返したり索引を付けることができない理由を教えてください。その型はHashtable + keyCollectionです。これは少なくともコレクションの一種であることを意味します。 – BobHy

0

あなたはまた、条件が成立し、すべての要素を返しますDictionary.KeysWhereメソッドを使用することができます。

は、したがって、あなたは、列挙子を使用するようにフォールバックしています。その状態は、テストされたキー$_が辞書の"True"値に関連していることを表明するラムダかもしれません。

[email protected]{"ComponentNameX"="True"; 
         "ComponentNameXyz"="False"; 
         "SomeComponent"="False"} 
$ComponentTobeBuild.Keys.Where({$ComponentTobeBuild[$_] -eq "True"}) 
# -> @("ComponentNameX") 
関連する問題