我在PowerShell中有一个哈希表,如下所示:
Profil = @{
"Jason" = "P2, P4, P1";
"Mick" = "P1";
"Rocky" = "P4, P5";
"Natasha" = "P9, P4, P1"
}
我需要删除空格并进行类似的排序:
Profil = @{
"Jason" = "P1,P2,P4";
"Mick" = "P1";
"Rocky" = "P4,P5";
"Natasha" = "P1,P4,P9"
}
我尝试foreach($value in $Profil.GetEnumerator() | Sort Value) {$value.Value}
,但不起作用
答案 0 :(得分:3)
$Profil = @{
"Jason" = "P2, P4, P1"
"Mick" = "P1"
"Rocky" = "P4, P5"
"Natasha" = "P9, P4, P1"
}
# Create an empty Hashtable with a capacity equal or greater than the number of
# elements in $Profil
$ProfilSorted = [Hashtable]::New($Profil.Count)
foreach ($KeyAndValue in $Profil.GetEnumerator())
{
# RegEx split on a comma followed by whitespace.
[String[]]$Value = $KeyAndValue.Value -split ',\s*' |
Sort-Object
# Convert $Value from array of Strings to single String joined by commas.
[String]$Value = $Value -join ','
$ProfilSorted.Add($KeyAndValue.Key, $Value)
}
$Profil = $ProfilSorted
$Profil
您可能要考虑将值存储为字符串[String[]]
的数组,而不是依赖于文本拼写。
答案 1 :(得分:2)
以下使用 foreach
声明 更新哈希表(我已替换了$Profil
与$hash
一起使用,以避免与自动$PROFILE
变量混淆。)
foreach ($key in @($hash.Keys)) {
$hash[$key] = ($hash[$key] -split ', *' | Sort-Object) -join ','
}
$hash # output the updated hash table
$hash.Keys
枚举哈希表的键,以便在循环中使用。
@(...)
,这对于有效地克隆.Keys
集合是必需的,以便允许在循环内更新哈希表。 $hash[$key]
访问单个密钥。
.
)像访问哈希表条目一样作为属性,并且通常允许变量引用和表达式指定属性名,因此$hash.key
可以工作也是。 -split ', *'
将现有条目值按逗号分隔为令牌,后跟零个或多个(*
)空格。
| Sort-Object
对结果标记进行排序。
-join ','
将已排序的令牌以逗号作为分隔符。
使用管道 也是一种选择,但通常会慢一些(尽管在许多使用情况下这并不重要):< / p>
@($hash.Keys) | ForEach-Object {$hash[$_]= ($hash[$_] -split ', *' | Sort-Object) -join ','}
答案 2 :(得分:2)
这应该有效:
public class Item
{
public int Id { get; set; }
public IDictionary<string, object> Settings { get; set; }
}