PowerShell哈希表中移除键内重复值的问题求助
PowerShell哈希表去重解决方案
原代码的问题分析
- 变量赋值顺序错误:第一个
if判断时,$agentName还未从当前行的$row.Agent_Name赋值,导致该判断完全无效,所有行都会进入else块执行。 - 未检查重复值就拼接:当键已存在时,直接追加
$listID,没有验证该值是否已经存在于当前键的值中,导致重复添加。 - 无效的存在性判断:新增键时的
$agentListHashTable.$agentName.Contains($listID)毫无意义,因为此时键还不存在,对应值为$null,无法调用Contains方法。
修正方案一:直接基于字符串去重
调整变量赋值顺序,每次拼接前先拆分现有值为数组,检查是否已包含目标ID:
foreach($row in $callLog) { # 优先从当前行获取Agent名称和ID $agentName = $row.Agent_Name $listID = $row.LID.ToString() # 统一为字符串类型,避免类型匹配问题 if($agentListHashTable.ContainsKey($agentName)) { # 将现有值拆分为数组,精确检查是否已包含当前ID $existingIDs = $agentListHashTable.$agentName -split ',' if(-not $existingIDs.Contains($listID)) { $agentListHashTable.$agentName += ",$listID" } } else { # 不存在该键时直接添加 $agentListHashTable.Add($agentName, $listID) } }
修正方案二:用数组存储值(更可靠)
先将每个键的值存储为数组,利用数组的精确匹配去重,最后统一转换为逗号分隔的字符串,避免字符串匹配的边界问题:
# 初始化哈希表,值以数组形式存储 $agentListHashTable = @{} foreach($row in $callLog) { $agentName = $row.Agent_Name $listID = $row.LID if($agentListHashTable.ContainsKey($agentName)) { # 检查数组中是否不存在当前ID,不存在则添加 if($listID -notin $agentListHashTable.$agentName) { $agentListHashTable.$agentName += $listID } } else { # 新增键时,将ID包装为单元素数组存入 $agentListHashTable.Add($agentName, @($listID)) } } # 遍历哈希表,将数组转换为逗号分隔的字符串 $agentListHashTable.GetEnumerator() | ForEach-Object { $_.Value = $_.Value -join ',' }
执行上述任意方案后,哈希表中每个键对应的值都会是去重后的唯一ID列表,比如Jim Smith对应的值会是1,2,22,44。
内容的提问来源于stack exchange,提问作者Thomton
相关产品推荐
相关产品推荐

