我需要比较多个数组。有一个主数组包含子数组所具有的所有元素以及一些额外元素。
在下面的示例中,$a
是主数组,$b
,$c
是子数组。
我需要比较这些数组并获取$a
中$b
和$c
中不存在的那些额外元素的列表。
实际上,在我的情况下,有10个子数组和一个主数组。
$a="dhaw","roh","kohl","faf","abd","steyn","gupt","baz","kane","benn","brendn","joyc"
$b="roh","dhaw","kohl"
$c="steyn","abd","faf","roh","dhaw"
答案 0 :(得分:4)
一个可行的解决方案可能是使用arco444建议的-notcontains
运算符,循环遍历$a
数组元素并检查它们是否至少包含在其他一个数组中。
这是一段代码
foreach($a_value in $a) {
if (($b -notcontains $a_value) -and ($c -notcontains $a_value)) {
"$a_value is extra"
}
}
答案 1 :(得分:1)
这样的东西?
Compare-Object -ReferenceObject $a -DifferenceObject ($b + $c)
如果您只想获得原始对象:
(Compare-Object -ReferenceObject $a -DifferenceObject ($b + $c) |
Where-Object {$_.SideIndicator -eq '<='}).InputObject
答案 2 :(得分:1)
正则表达式解决方案:
$a="dhaw","roh","kohl","faf","abd","steyn","gupt","baz","kane","benn","brendn","joyc"
$b="roh","dhaw","kohl"
$c="steyn","abd","faf","roh","dhaw"
$b_regex = ‘(?i)^(‘ + (($b |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’
$c_regex = ‘(?i)^(‘ + (($c |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’
然后,对于不在$ b中的$ a元素:
$a -notmatch $b_regex
faf
abd
steyn
gupt
baz
kane
benn
brendn
joyc
对于不在$ c中的$ a元素:
$a -notmatch $c_regex
kohl
gupt
baz
kane
benn
brendn
joyc
对于不在$ b或$ c中的$ a元素:
$a -notmatch $b_regex -notmatch $c_regex
gupt
baz
kane
benn
brendn
joyc
注意:这仅用于为发表评论的人员进行演示。这比-contains / -notcontains
解决方案快得多,但对于单个实例的比较,它可能有点过分。它可以在循环中产生显着的性能提升,您可以将一个数组与许多其他数组进行比较。