Я думаю, будет лучше, если вы определите условие равенства в методе IsEqualTo
для своего пользовательского объекта.Итак, что-то вроде этого:
$myObject = New-Object PSObject
$myObject | Add-Member -MemberType NoteProperty -Name Name -Value $name
$myObject | Add-Member -MemberType NoteProperty -Name Schema -Value $schema
$myObject | Add-Member -MemberType ScriptMethod -Name IsEqualTo -Value {
param (
[PSObject]$Object
)
return (($this.Name -eq $Object.Name) -and ($this.Schema -eq $Object.Schema))
}
Тогда вы можете сделать однострочную, как показал нам Кит, или просто выполнить двойную итерацию foreach
.Все, что вы считаете более читабельным:
$filteredSQLObjects = $SQLObjects1 | Where-Object { $SQLObject1 = $_; $SQLObjects2 | Where-Object { $_.IsEqualTo($SQLOBject1) } }
foreach ($SQLObject1 in $SQLObjects1)
{
foreach ($SQLObject2 in $SQLObjects2)
{
if ($SQLObject1.IsEqualTo($SQLObject2))
{
$filteredSQLObjects += $SQLObject1
}
}
}
РЕДАКТИРОВАТЬ
ОК, для начала вы не можете добавитьEquals
член, потому что он уже существует на System.Object
(дох!).Поэтому я думаю, IsEqualTo
придется сделать вместо этого.
Что вы можете сделать, это определить свою собственную функцию с именем Intersect-Object
(эквивалент Enumerable.Intersect
метода .NET), которая принимаетвводит конвейер и возвращает заданное пересечение двух последовательностей (те, которые появляются в обеих последовательностях).Имейте в виду, что я не полностью реализовал эту функцию (предполагается, что каждый элемент в коллекции, указанной Sequence
, имеет метод IsEqualTo
, не проверяет дубликаты перед добавлением в $filteredSequence
и т. Д.), Но я надеюсь, что выполучить представление.
function Intersect-Object
{
param (
[Parameter(ValueFromPipeline = $true)]
[PSObject]$Object,
[Parameter(Mandatory = $true)]
[PSObject[]]$Sequence
)
begin
{
$filteredSequence = @()
}
process
{
$Sequence | Where-Object { $_.IsEqualTo($Object) } | ForEach-Object { $filteredSequence += $_ }
}
end
{
return $filteredSequence
}
}
Тогда ваш двойной цикл foreach
превращается в это:
$filteredSQLObjects = $SQLObjects1 | Intersect-Object -Sequence $SQLObjects2