Powershell 从哈希表中删除重复值
我是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集合,这是必要的,因为在枚举集合时尝试
“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 ','}