Group-Object, получить счет
Учитывая список с некоторыми повторяющимися элементами, я могу использовать
Group-Object -AsHashtable
и я получаю хеш-таблицу, в которой, кажется, есть ключи с именами элементов, а значение - это то, чего я не узнаю.
Итак, учитывая
$array = [System.Collections.Generic.List[String]]@('A', 'B', 'C', 'B', "c", 'C')
$grouped = $array | Group-Object -AsHashTable
$grouped
будет
Name Value
---- -----
A {A}
B {B, B}
C {C, c, C}
В этот момент я бы подумал, что
$grouped['B'].Count
или
$grouped.'B'.Count
даст правильное количество 2. Но я получаю 0. Что мне не хватает?
2 ответа
Вы видите ошибку в Windows PowerShell , которая с тех пор была исправлена в PowerShell (Core) 7+ — подробности см. в GitHub issue #6933 .
Обходной путь : в Windows PowerShell всегда комбинируйте
-AsHashTable
с
-AsString
, даже если входные объекты или значения свойств группировки уже являются строками. Совет user14903754 .
# Note: .B.Count is equivalent to ['B'].Count
PS> ('A', 'B', 'C', 'B', "c", 'C' | Group-Object -AsHashTable -AsString).B.Count
2 # OK, thanks to -AsString (not necessary in PowerShell 7+)
Это позволяет обойти ошибку, которая в противном случае проявляется следующим образом: строки, которые должны стать ключами хеш-таблицы, неожиданно заворачиваются в невидимые оболочки , что, в свою очередь, препятствует поиску ключей на основе строк.
(
('A', 'B', 'C', 'B', "c", 'C' | Group-Object -AsHashTable).B
урожаи
$null
в Windows PowerShell.)
Примечание: подразумевается, что вы не можете использовать
-AsHashtable
в Windows PowerShell, если вы хотите, чтобы ключи имели тип данных, отличный от строки (например
,[int]
), потому что для таких типов данных невидимый
[psobject]
обкатку обойти нельзя.
попробуйте ниже (это сработало для меня, см. рис.)
$array = [System.Collections.Generic.List[String]]@('A', 'B', 'C', 'B', "c", 'C')
$grouped = $array | Group-Object -AsHashTable
$grouped.B
$grouped.B.Count
Write-Host $grouped.B.Count
$b = $grouped.B.Count
Write-Host "The Number of Values in Column B Is - $b"