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

PowerShell比对两个数组生成无重复匹配/不匹配列表的代码问题

问题根因分析

  • 原代码的存在性判断逻辑错误:和$arr2单个元素不相等就判定为不存在,未遍历完全部$arr2元素就执行添加操作
  • 去重逻辑缺失:向两个列表添加元素前未判断是否已存在
  • 嵌套逻辑冗余:$NotinList初始为空时,遍历它的k循环永远不会执行,无法向$NotinList写入任何数据
  • 重复添加问题:未去重的情况下,$arr1的重复元素会被多次写入匹配/不匹配列表

修正方案

有两种实现方式,分别是兼容低版本PowerShell的循环实现,和用内置方法简化的高效实现:

方案1:基础循环实现(和原代码逻辑对齐优化)

$arr1 = @(1,2,3,4,4,2,5,7,9,9,1) 
$arr2 = @(5,1,2,3,6,8,1) 
$NotinList = @()
$inList = @()

foreach ($item in $arr1) {
    # 先判断当前元素是否已经在任意一个列表中,已经存在就跳过实现去重
    if ($inList -contains $item -or $NotinList -contains $item) {
        continue
    }
    # 判断元素是否在$arr2中
    if ($arr2 -contains $item) {
        $inList += $item
    } else {
        $NotinList += $item
    }
}

# 输出验证结果
Write-Host "匹配列表:" $inList
Write-Host "不匹配列表:" $NotinList

方案2:高效内置方法实现(PowerShell 3.0+支持)

利用Select-Object -Unique先对$arr1去重,再用Compare-Object快速比对,代码更简洁:

$arr1 = @(1,2,3,4,4,2,5,7,9,9,1) | Select-Object -Unique
$arr2 = @(5,1,2,3,6,8,1)

$compareResult = Compare-Object -ReferenceObject $arr1 -DifferenceObject $arr2 -IncludeEqual

$inList = $compareResult | Where-Object SideIndicator -eq '==' | Select-Object -ExpandProperty InputObject
$NotinList = $compareResult | Where-Object SideIndicator -eq '<=' | Select-Object -ExpandProperty InputObject

# 输出验证结果
Write-Host "匹配列表:" $inList
Write-Host "不匹配列表:" $NotinList

运行结果验证

两种方案最终输出一致:

匹配列表: 1 2 3 5
不匹配列表:4 7 9

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:24:02