web-dev-qa-db-fra.com

Comment obtenir une clé de table de hachage qui a une valeur spécifique?

J'ai une table de hachage où les clés sont utilisées en fonction de la valeur.

Par ex. 

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

Je voudrais obtenir les clés qui ont des valeurs True. (Je vais passer la clé à un autre script en tant que paramètre).

J'essayais comme ça, mais je pense qu'il me manque des endroits car ce n'est pas la liste des clés.

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

Comment obtenir le composant Name qui a été noté True? Aussi, j'aimerais savoir si la table de hachage est un choix judicieux pour ce type de travail. Parce que je pensais que la table de hachage serait principalement utilisée pour traiter les valeurs. 

12
Samselvaprabu

Bonjour cela devrait fonctionner pour ce que vous voulez.

$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" }
17
David Brabant

Je sais que c'est vieux, mais j'ai vu cela dans ma recherche d'un autre problème et je me suis demandé pourquoi vous dérangez-vous avec les recenseurs. Il suffit de construire le code exactement comme la question en langage réel:

Donnez-moi toutes les clés, où la valeur est 'True'.

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

Par souci de cohérence, je l’encapsulerais dans @() pour obtenir un tableau même s’il n’ya qu’un résultat, voire aucun.

En ce qui concerne la solution proposée par le demandeur, le problème est que $_ est une chaîne et .Value n'est pas la valeur de la clé. Cela n'existe tout simplement pas dans une chaîne. Vous devez obtenir la valeur de la table de hachage avec $_ comme clé pour pouvoir la comparer.

8
Wiz

Le problème avec le filtrage des tables de hachage dans PowerShell est qu'il est impossible d'effectuer une itération sur les paires clé-valeur.

Disons que vous avez une collection:

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

Vous vous attendez à pouvoir utiliser 

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

dans PowerShell, mais ce n'est pas possible.

Par conséquent, vous utilisez l’énumérateur:

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

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

Vous pouvez également utiliser la méthode Dictionary.Keys 'Where qui renvoie tous les éléments dans lesquels une condition est vraie. Cette condition pourrait être un lambda affirmant que la clé testée $_ se rapporte à une valeur "True" dans le dictionnaire.

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