我有两个ArrayList listA
和listB
。 listB
是listA
的子集。
现在,我要从listB
中删除listA
中包含的所有项目。
这是我的列表的样子:
Name ID Domain ---- -- ------ item1 456 domain1 item2 716 domain2 item3 421 domain2 item4 796 domain1
Name ID Domain ---- -- ------ item2 716 domain2 item4 796 domain1
我已经尝试使用
$listA = $listA | Where-Object {$listB -notcontains $_}
但这对我的数据不起作用。
答案 0 :(得分:1)
您可以使用Compare-Object
cmdlet进行此操作。
如果您的列表是这样的:
$listA = @()
$listA += [PSCustomObject]@{Name = 'item1' ; ID = '456'; Domain = 'domain1'}
$listA += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item3' ; ID = '421'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
$listB = @()
$listB += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listB += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
然后考虑所有属性,删除$listA
中也属于$listB
的所有对象,请执行以下操作:
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property Name,ID,Domain).SideIndicator -eq '<=' }
此后,$listA
仅剩以下两个成员:
Name ID Domain ---- -- ------ item1 456 domain1 item3 421 domain2
修改
除了像上面那样实际命名要比较的属性外,您还可以将它们收集在变量中。对于PS版本3及更高版本,请执行以下操作:
$props = $listA[0].psobject.properties.name
3.0以下的PowerShell版本使用:
$props = $listA[0].psobject.properties | ForEach-Object { $_.name }
然后您可以将行更改为
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property $props).SideIndicator -eq '<=' }
当然,只有在两个列表具有相同的属性名称进行比较的情况下。