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

如何从ArrayList删除引用类型对象并解决对象匹配问题?

问题分析与解决方案

你的代码中$matched无法被$rightTable.Remove()成功删除的核心原因是:

  • Compare-Object会生成全新的PSCustomObject实例,即使属性值与$rightTable中的元素一致,也是完全独立的对象引用。
  • 后续的Select-Object又再次生成新对象,进一步切断了与原$rightTable元素的引用关联。
  • ArrayList.Remove()默认使用引用相等性检查(Object.Equals()的默认实现),因此无法识别这些新对象。

修正方案:获取原对象引用

直接从$rightTable中筛选出与当前$line匹配的原对象实例,而非生成新对象,这样Remove()就能正常工作。

基础版代码(适用于小数据集)

$leftTable = Import-Csv -Delimiter ';' -Path "C:\temp\linux_left.csv" 
[System.Collections.ArrayList]$rightTable = Import-Csv -Delimiter ';' -Path "C:\temp\linux_right.csv"
$finalTable = @()

foreach($line in $leftTable) {   
    # 直接在rightTable中查找匹配的原对象
    $matchedOriginal = $rightTable | Where-Object {
        $_.asset.name -eq $line.asset.name -and
        $_.definition.id -eq $line.definition.id -and
        $_.definition.name -eq $line.definition.name -and
        $_.state -eq $line.state
    }

    if($matchedOriginal)
    {
        # 按需筛选属性后加入结果集(如果不需要筛选可直接添加$matchedOriginal)
        $finalTable += $matchedOriginal | Select-Object 'asset.name','definition.id','definition.name','state'
        # 移除原对象(同一引用,Remove可成功)
        $rightTable.Remove($matchedOriginal)
    }
    else
    {
        # 处理不匹配的逻辑
        ...
    }
}

优化版代码(适用于大数据集)

如果$rightTable数据量较大,遍历筛选效率偏低,可以预先构建哈希索引加速查找:

$leftTable = Import-Csv -Delimiter ';' -Path "C:\temp\linux_left.csv" 
[System.Collections.ArrayList]$rightTable = Import-Csv -Delimiter ';' -Path "C:\temp\linux_right.csv"
$finalTable = @()

# 构建rightTable的哈希索引,用属性组合作为键
$rightTableIndex = @{}
foreach($item in $rightTable) {
    $key = "$($item.asset.name)|$($item.definition.id)|$($item.definition.name)|$($item.state)"
    $rightTableIndex[$key] = $item
}

foreach($line in $leftTable) {   
    $key = "$($line.asset.name)|$($line.definition.id)|$($line.definition.name)|$($line.state)"
    if($rightTableIndex.ContainsKey($key))
    {
        $matchedOriginal = $rightTableIndex[$key]
        $finalTable += $matchedOriginal | Select-Object 'asset.name','definition.id','definition.name','state'
        $rightTable.Remove($matchedOriginal)
        # 从索引中移除已匹配项,避免重复处理
        $rightTableIndex.Remove($key)
    }
    else
    {
        # 处理不匹配的逻辑
        ...
    }
}

内容的提问来源于stack exchange,提问作者Philippe Hebert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:14:55