我有一个数组
$a = (Invoke-RestMethod -Uri "...." -Method Get) | select X,Y,Z # Object[] Z has type of datetime
$a
有X, Y, Z
。
现在我需要检查$a
中是否有行
$x,$y,$z = ....
if ($a -contains $x,$y, $x) { ... } # doesn't work
如何做到?
答案 0 :(得分:1)
听起来您想测试数组$a
是否包含一个对象,该对象具有给定的一组给定的属性值($x
,$y
,$z
)属性名称集(.X
,.Y
,.Z
):
$hasObjectWithValues = [bool] $(foreach ($o in $a) {
if ($o.X -eq $x -and $o.Y -eq $y -and $o.Z -eq $z) {
$true
break
}
})
注意:简洁的[bool] $hasObjectWithValues = foreach ...
格式可以工作,但是从PowerShell Core 7.0.0-preview.4开始,由于{{3} }
关于您尝试过的事情:
$a -contains $x,$y, $z
PowerShell this bug的RHS仅支持标量(单个值),该值将被测试是否与数组值LHS中的元素相等。
但是,即使将RHS封装到单个对象-[pscustomobject] @{ X = $x, Y = $y, Z = $z }
中,该方法也不起作用,因为[pscustomobject]
和Invoke-RestMethod
返回的A[t, vec]<- 0.5 * Matrix::rowSums(cbind(A[vec,fam[t,"dad"]],A[vec,fam[t,"mum"]]), na.rm=T)
s是引用类型,在没有自定义相等比较行为的情况下,将通过引用相等进行比较,这意味着它们仅在引用非常相同时才被视为相等内存中的对象。