我正在使用自定义对象来保存一组SQL Server对象中的名称和架构。我把对象放到一个数组中,然后我得到另一组对象并将它们放入另一个数组中。我现在要做的是找到两个数组之间的所有完全匹配。
我目前正在使用它:
$filteredSQLObjects = @()
foreach ($SQLObject1 in $SQLObjects1)
{
foreach ($SQLObject2 in $SQLObjects2)
{
if ($SQLObject1.Name -eq $SQLObject2.Name -and
$SQLObject1.Schema -eq $SQLObject2.Schema)
{
$filteredSQLObjects += $SQLObject1
}
}
}
有更好/更快/更清洁的方法吗?最初当我刚刚处理字符串数组时,我可以循环遍历其中一个数组并在第二个数组中使用-contains,但是对象似乎不可能。
谢谢!
答案 0 :(得分:3)
如果您在自定义对象的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))
}
然后你可以像Keith给我们一样做一个单行,或者只做你的双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
必须这样做。
你可以做的是定义你自己的函数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
答案 1 :(得分:2)
你可以将它浓缩成一个单行,如果你在控制台上写这个是适当的:
$filtered = $SQLObjects1 | ? {$o1=$_; $SQLObjects2 | ? {$_.Name -eq $o1.Schema `
-and $_.Name -eq $o1.Schema}}
但是在脚本中,我会像你一样扩展它。它更具可读性。