在Powershell中的哈希表中对多个值进行排序

时间:2018-08-23 14:07:30

标签: powershell sorting hashtable trim

我在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},但不起作用

3 个答案:

答案 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]访问单个密钥。

    • 请注意,PowerShell还允许点符号(.)像访问哈希表条目一样作为属性,并且通常允许变量引用和表达式指定属性名,因此$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; }
}