Как проверить, существует ли строка в массиве объектов? - PullRequest
1 голос
/ 03 октября 2019

У меня есть массив

$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

Как это сделать?

1 Ответ

1 голос
/ 03 октября 2019

Звучит так, как будто вы хотите проверить массив $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, нет, из-за этой ошибки


Что касается того, что вы пытались :

$a -contains $x,$y, $z

RHS оператора -contains PowerShell поддерживает только скаляр (одно значение), который проверяется на равенство с элементами вLHS со значением массива.

Однако, даже если вы обернули вашу RHS в один объект - [pscustomobject] @{ X = $x, Y = $y, Z = $z }, этот подход не сработает, потому что [pscustomobject] s, что также возвращается Invoke-RestMethodявляются ссылочными типами , которые - в отсутствие пользовательского поведения сравнения равенства - сравниваются по ссылочному равенству , что означает, что они считаются равными, только если они ссылаютсяк тому же объекту в памяти .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...