Невозможно перебрать String HashSet с помощью foreach в Powershell при заполнении данных с помощью метода Add () - PullRequest
0 голосов
/ 19 июня 2020

Здесь мой HashSet сгенерирован, а также правильно заполнен, что видно по строке $ hashSet.Contains ("hi") . Единственная проблема в том, что я не могу перебирать эту строку HashSet и выводить уникальные строковые элементы только потому, что я использую метод Add () для заполнения строковых элементов.

Я пробовал оба способа, используя GetEnumerator () и Keys .

$hashSet = New-Object 'System.Collections.Generic.HashSet[string]';


$hashSet.Add("hi");
$hashSet.Add("hello");
$hashSet.Add("hi");


foreach ($h in $hashSet.GetEnumerator()) {
    Write-Host "$($h.Name): $($h.Value)"
}

foreach ($h in $hashSet.Keys) {
    Write-Host "${h}: $($hashSet.Item($h))"
}

$hashSet.Contains("hi")

Это результат, который я получаю.

PS C:\windows\system32\WindowsPowerShell\v1.0> C:\Users\SomeUser\powershell\HashsetInPowershell.ps1
True
True
False
: 
: 
True

1 Ответ

0 голосов
/ 19 июня 2020

Ошибка заключалась в обработке HashSet как словаря. Set-StrictMode будет удобным инструментом для выявления подобных ошибок.

Совместное использование правильного скрипта ниже.

$hashSet = New-Object 'System.Collections.Generic.HashSet[string]';


[void] $hashSet.Add("hi");
[void] $hashSet.Add("hello");
[void] $hashSet.Add("hi");


foreach ($h in $hashSet) {
    Write-Host "${h}"
}

$hashSet.Contains("hi")

Вывод

PS C:\windows\system32\WindowsPowerShell\v1.0> C:\Users\SomeUser\powershell\HashsetInPowershell.ps1
hi
hello
True 
...