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
(doh!)。だから私IsEqualTo
は代わりにやらなければならないだろうと思います。
できることは、パイプライン入力を受け入れ、2つのシーケンス(両方のシーケンスに現れるもの)の設定された共通部分を返す、Intersect-Object
(。NETのメソッドと同等の)という独自の関数を定義することです。Enumerable.Intersect
この関数は完全には実装されていないことに注意してください(によって指定されたコレクション内の各アイテムにメソッドがあり、追加する前に重複をチェックしないことを前提としてい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