Powershell 从哈希表中删除重复值

Powershell 从哈希表中删除重复值,powershell,powershell-2.0,powershell-3.0,Powershell,Powershell 2.0,Powershell 3.0,我是powershell新手,需要从哈希表中删除重复的值,例如“c”具有重复的3-“3,4,3”,“d”具有重复的1-“1,1,6,4” 我怎样才能得到结果 我已经尝试了选择对象-唯一,但没有成功。为了使用选择对象-唯一,您的值必须在集合(数组)中,而不是在单个字符串中 因此,您必须首先将字符串拆分为一个令牌数组(-split运算符),然后将不同的令牌重新组装为一个字符串(-join运算符) 请注意@(…)周围的$alpha.Keys,它有效地克隆了Keys集合,这是必要的,因为在枚举集合时尝试

我是powershell新手,需要从哈希表中删除重复的值,例如
“c”
具有重复的3-
“3,4,3”
“d”
具有重复的1-
“1,1,6,4”

我怎样才能得到结果


我已经尝试了
选择对象-唯一
,但没有成功。

为了使用
选择对象-唯一
,您的值必须在集合(数组)
中,而不是在单个字符串中

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

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

您也可以使用管道调用
ForEach对象
%
)cmdlet(而不是带有
ForEach
循环的表达式),但是对于内存中的数据结构,
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.
为了完整起见,这里是管道解决方案(用于细化的提示):

请注意,
@(…)
$alpha.Keys
周围仍然需要,就像在
foreach
语句解决方案中一样

与在
foreach
解决方案中一样,这会在适当的位置修改哈希表

另一个选项是使用
$alpha.GetEnumerator()
强制PowerShell通过管道逐个发送哈希表的条目,默认情况下为
[System.Collections.DictionaryEntry]
实例,这些实例表示带有
.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.

如前所述,这些是字符串,请先拆分它们,然后重新连接:

$NewAlpha = $Alpha.GetEnumerator() |% { $_.value = ($_.value -split "," | select -unique) -join "," ; $_}
注意:这不会保留[hashtable]类型。 要做到这一点,您需要采用


答案的核心部分(值转换部分)是合理的,但您不是在创建新的哈希表,而是在创建一个
[System.Collections.DictionaryEntry]
实例数组。如果将
$NewAlpha
输出到控制台,这可能不明显,但是
$NewAlpha.GetType().FullName
$NewAlpha[0].GetType().FullName
会告诉您。顺便说一句:OP的用例不需要创建新的哈希表。关于输出类型的好理解。这是真的。
$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.
$NewAlpha = $Alpha.GetEnumerator() |% { $_.value = ($_.value -split "," | select -unique) -join "," ; $_}
@($alpha.Keys) |% {$alpha.$_ = ($alpha.$_ -split ',' | Select-Object -Unique) -join ','}