You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell哈希表中移除键内重复值的问题求助

PowerShell哈希表去重解决方案

原代码的问题分析

  1. 变量赋值顺序错误:第一个if判断时,$agentName还未从当前行的$row.Agent_Name赋值,导致该判断完全无效,所有行都会进入else块执行。
  2. 未检查重复值就拼接:当键已存在时,直接追加$listID,没有验证该值是否已经存在于当前键的值中,导致重复添加。
  3. 无效的存在性判断:新增键时的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:52:53