webentwicklung-frage-antwort-db.com.de

Wie bekomme ich einen Hashtabellenschlüssel, der einen bestimmten Wert hat?

Ich habe eine Hashtabelle, in der Schlüssel basierend auf dem Wert verwendet werden.

Für ex. 

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

Ich möchte die Schlüssel erhalten, die Werte haben. (Ich werde den Schlüssel als Parameter an ein anderes Skript übergeben).

Ich habe es so versucht, aber ich denke, einige, wo ich vermisse, da es nicht die Schlüssel auflistet.

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

Wie erhalte ich den Namen der Komponente, der als wahr gekennzeichnet wurde? Ich möchte auch gerne wissen, ob Hash Table eine gute Wahl für diese Art von Arbeit ist. Denn ich dachte, dass die Hash-Tabelle hauptsächlich für die Verarbeitung der Werte verwendet wird. 

12
Samselvaprabu

Hi das sollte funktionieren was du willst.

[email protected]{"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" }
17
David Brabant

Ich weiß, das ist alt, aber ich habe es auf meiner Suche nach einem anderen Problem gesehen und mich gewundert, warum Sie sich mit Enumerators beschäftigen. Erstellen Sie einfach den Code genau wie die Frage in der richtigen Sprache:

Gib mir alle Schlüssel, bei denen der Wert 'True' ist.

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

Aus Gründen der Konsistenz würde ich das in @() einkapseln, um ein Array zu erhalten, selbst wenn es nur ein oder kein Ergebnis gibt.

Bei der Lösung, die der Fragesteller hatte, besteht das Problem darin, dass $_ ein String ist und .Value nicht der Wert des Schlüssels ist. Es existiert einfach nicht in einem String. Sie müssen den Wert der Hashtabelle mit $_ als Schlüssel abrufen, um sie zu vergleichen.

8
Wiz

Das Problem beim Filtern von Hashtables in PowerShell besteht darin, dass Sie die Schlüssel-Wert-Paare nicht durchlaufen können.

Nehmen wir an, Sie haben eine Sammlung:

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

Sie würden erwarten zu können 

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

in PowerShell, aber das ist nicht möglich.

Deshalb müssen Sie auf den Enumerator zurückgreifen:

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

Name                           Value
----                           -----
d                              D
b                              B
a                              A
5
oɔɯǝɹ

Sie können auch die Methode Dictionary.Keys 'Where verwenden, die alle Elemente zurückgibt, für die eine Bedingung erfüllt ist. Diese Bedingung könnte ein Lambda sein, das behauptet, dass der getestete Schlüssel $_ sich auf einen "True"-Wert im Wörterbuch bezieht.

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