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
相关产品推荐
相关产品推荐

