2017-01-12 3 views
0

Gibt es eine einfache Möglichkeit, zwei Arrays von PsCustomObject s zu vergleichen?Vergleichen Sie zwei Arrays von PsCustomObjects

Beispiel A (Reihenfolge unabhängig):

$Expected = @() 
$Expected += [PsCustomObject]@{Table='patient';ColumnName='id'} 
$Expected += [PsCustomObject]@{Table='patient';ColumnName='mrn'} 

$Actual = @() 
$Actual += [PsCustomObject]@{Table='patient';ColumnName='mrn'} 
$Actual += [PsCustomObject]@{Table='patient';ColumnName='id'} 

Compare-ByFoo ($Expected $Actual).Count | Should Be 0 

Beispiel B (missing value):

$Expected = @() 
$Expected += [PsCustomObject]@{Table='patient';ColumnName='id'} 
$Expected += [PsCustomObject]@{Table='patient';ColumnName='mrn'} 

$Actual = @() 
$Actual += [PsCustomObject]@{Table='';ColumnName='id'} 
$Actual += [PsCustomObject]@{Table='patient';ColumnName='id'} 

Compare-ByFoo ($Expected $Actual).Count | Should Be 1 

Beispiel C (fehlende Eigenschaft):

$Expected = @() 
$Expected += [PsCustomObject]@{Table='patient';ColumnName='id'} 
$Expected += [PsCustomObject]@{Table='patient';ColumnName='mrn'} 

$Actual = @() 
$Actual += [PsCustomObject]@{Table='patient'} 
$Actual += [PsCustomObject]@{Table='patient';ColumnName='id'} 

Compare-ByFoo ($Expected $Actual).Count | Should Be 1 

Beispiel D (fehlende Aufzeichnung):

$Expected = @() 
$Expected += [PsCustomObject]@{Table='patient';ColumnName='id'} 
$Expected += [PsCustomObject]@{Table='patient';ColumnName='mrn'} 

$Actual = @() 
$Actual += [PsCustomObject]@{Table='patient';ColumnName='id'} 

Compare-ByFoo ($Expected $Actual).Count | Should Be 1 

Antwort

1

könnten Sie Compare-Object verwenden und ihm sagen, welche Eigenschaften vergleichen:

@(Compare-Object $Expected $Actual -Property Table, ColumnName | 
    Where-Object { $_.SideIndicator -eq '=>' }).Count 

Die Eigenschaften sogar von einem der erwarteten oder tatsächlichen Objekte extrahiert werden können, sofern sie alle haben die gleiche Struktur:

$props = $Expected[0].PSObject.Properties | Select-Object -Expand Name 
@(Compare-Object $Expected $Actual -Property $props | 
    Where-Object { $_.SideIndicator -eq '=>' }).Count 
+0

Elegante Lösung. – craig

Verwandte Themen