J'ai heurté un mur en essayant d'obtenir une table de hachage de tables de hachage à trier. Il semble que l'acte de trier transforme la table de hachage en quelque chose d'autre, et je suis incapable de parcourir la nouvelle structure.

$mainHashTable = @{}
$mainHashTable.Add('B', @{'one'='B1'; 'two'='B2'; 'three'='B3'})
$mainHashTable.Add('D', @{'one'='D1'; 'two'='D2'; 'three'='D3'})
$mainHashTable.Add('A', @{'one'='A1'; 'two'='A2'; 'three'='A3'})
$mainHashTable.Add('C', @{'one'='C1'; 'two'='C2'; 'three'='C3'})

CLS
$mainHashTable
foreach ($hashtable in $mainHashTable.keys) {

    foreach ($itemKey in $mainHashTable.$hashtable.keys) {
        Write-Host "$itemKey $($mainHashTable.$hashtable.$itemKey)!"
    }
}
Write-Host
$sortedHashTable = $mainHashTable.GetEnumerator() | sort-object -property name
$sortedHashTable
foreach ($hashtable_S in $sortedHashTable.keys) {
    foreach ($itemKey_S in $sortedHashTable.$hashtable_S.keys) {
        Write-Host "$itemKey_S $($sortedHashTable.$hashtable_S.$itemKey2)!"
    }
}

Les deux lignes qui envoient $mainHashTable & $sortedHashTable à la console semblent tout va bien. Mais le deuxième jeu de boucles ne fait rien. j'ai essayé de lancer comme ça

$sortedHashTable = [hashtable]($mainHashTable.GetEnumerator() | sort-object -property name)

Et cela jette juste l'erreur

Impossible de convertir la valeur "System.Object[]" de type "System.Object[]" en type "System.Collections.Hashtable".

Alors, existe-t-il un moyen de convertir l'objet système en une table de hachage, afin que la structure de boucle fonctionne sur les résultats triés ? Ou est-ce que je ferais mieux d'apprendre à parcourir la structure du System.Object ? Et (académiquement peut-être), existe-t-il un moyen de trier une table de hachage et de récupérer une table de hachage?

0
Gordon 13 févr. 2020 à 00:47

1 réponse

Meilleure réponse

Ce que vous faites actuellement est de diviser la table de hachage en une liste d'entrées séparées (via .GetEnumerator()), puis de trier ce - vous vous retrouvez donc avec $sortedHashTable n'étant qu'un tableau d'objets de paire key/value, triés par clé, pas un [hashtable] réel.

existe-t-il un moyen de trier une table de hachage et de récupérer une table de hachage?

Non - vous ne pouvez pas "trier une table de hachage" en ligne, car les tables de hachage ne conservent aucun ordre de clé garanti.

La méthode à suivre ici est de copier les entrées dans un dictionnaire ordonné, dans l'ordre :

$sortedHashTable = [ordered]@{}

# Sort the keys, then insert into our ordered dictionary
foreach($key in $mainHashTable.Keys |Sort-Object){
    $sortedHashTable[$key] = $mainHashTable[$key]
}
2
Mathias R. Jessen 12 févr. 2020 à 22:27