从哈希表中删除重复值

Sno*_*ung 3 powershell powershell-2.0 powershell-3.0

我是PowerShell的新手,我需要从哈希表中删除重复的值,例如"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";
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到结果?

我已经尝试select-object -unique但不起作用.

mkl*_*nt0 5

为了使用Select-Object -Unique,您的值必须在集合(阵列),而不是一个单一的字符串中.

因此,您必须首先将字符串拆分为一个标记数组(-split运算符),然后将不同的标记重新组合成一个字符串(-join运算符).

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

请注意@(...)around $alpha.Keys,它有效地克隆了密钥集合,这是必要的,因为在枚举时尝试修改集合会导致错误,这是不受支持的.
PSv3 +中你可以使用$alpha.Keys.Clone(),这样更有效.

您还可以通过调用()cmdlet(而不是带循环表达式)来使用管道,但对于内存数据结构,循环通常是更好更快的选择.ForEach-Object%foreach foreach

为了完整起见,这里是管道解决方案(WayneA对其进行精炼的答案的提示):

@($alpha.Keys) | ForEach-Object { 
  $alpha[$_] = ($alpha[$_.] -split ',' | Select-Object -Unique) -join ',' 
}
Run Code Online (Sandbox Code Playgroud)

请注意,@(...)仍然需要$alpha.Keysforeach语句解决方案中使用.

foreach解决方案一样,这会修改哈希表.

另一个选项是使用$alpha.GetEnumerator()以强制PowerShell 通过管道逐个发送哈希表的条目,因为[System.Collections.DictionaryEntry]实例表示具有a .Key.Value属性的键值对- 默认情况下,PowerShell 作为整体输出哈希表.

但是,这需要创建一个新的哈希表,因为您从根本上无法修改枚举的集合.GetEnumerator()(因为foreach循环也隐式使用).

$newAlpha = @{} # initialize the new hash table
$alpha.GetEnumerator() | ForEach-Object { 
  $newAlpha[$_.Key] = ($alpha[$_.Key] -split ',' | Select-Object -Unique) -join ',' 
}
# $newAlpha now contains the updated entries.
Run Code Online (Sandbox Code Playgroud)