Удалить повторяющиеся значения из hashtables

Я новичок в powershell, и мне нужно удалить повторяющиеся значения из моей "3,4,3", например, "c" имеет дубликат 3 - "3,4,3" и "d" имеет дубликат 1 - "1,1,6,4".

[hashtable]$alpha = @{
"a" = "1";
"b" = "2,1,5";
"c" = "3,4,3";
"d" = "1,1,6,4";
"e" = "1,7,9,0";
}

Как я могу получить результат?

Я уже пробовал select-object -unique но не работает.

2 ответа

Как уже упоминалось, это строки, сначала разбивают их и воссоединяются после:

$NewAlpha = $Alpha.GetEnumerator() |% { $_.value = ($_.value -split "," | select -unique) -join "," ; $_}

Примечание: это не сохраняет тип [hashtable]. Для этого вам нужно будет использовать подход, упомянутый в ответе, предоставленном mklement0

@($alpha.Keys) |% {$alpha.$_ = ($alpha.$_ -split ',' | Select-Object -Unique) -join ','}


Чтобы использовать Select-Object -Unique, ваши значения должны быть в коллекции (массиве), а не внутри одной строки.

Таким образом, вы должны сначала разделить строку на массив токенов (оператор -split), а затем собрать отдельные токены в строку (оператор -join).

foreach ($key in @($alpha.Keys)) {
 $alpha.$key = ($alpha.$key -split ',' | Select-Object -Unique) -join ','
}

Обратите внимание на @(...) вокруг $alpha.Keys, который эффективно клонирует коллекцию ключей, что необходимо, потому что вы в противном случае получили ошибку из-за попытки изменить коллекцию во время ее перечисления, которая не поддерживается. В PSv3+ вместо этого вы можете использовать $alpha.Keys.Clone(), что более эффективно.

Вы также можете использовать конвейер с вызовом командлета ForEach-Object (%) (а не выражения с циклом foreach), но для структур данных в памяти цикл foreach обычно является лучшим и быстрым выбором.

Для полноты, здесь решение для трубопровода:

$alpha.GetEnumerator() | ForEach-Object { 
 $_.Value = ($_.Value -split ',' | Select-Object -Unique) -join ',' 
}

Как и в решении foreach, это изменяет хеш-таблицу на месте. Обратите внимание на необходимость вызова .GetEnumerator(), чтобы заставить PowerShell отправлять записи .GetEnumerator() отдельности через конвейер, в виде экземпляров [System.Collections.DictionaryEntry] представляющих пары ключ-значение с .Key и .Value. По умолчанию PowerShell выводит hashtables в целом.

licensed under cc by-sa 3.0 with attribution.