排序和比较Arraylists

时间:2017-12-01 14:13:59

标签: powershell sorting arraylist compare

我对Powershell很新,但有问题。 我似乎无法使用Compare-ObjectSort-Object功能。 我有两个Arraylists,我填写了10个"表"

类型的对象
#Create Arraylists
$list1 = new-object System.Collections.ArrayList
$list2 = new-object System.Collections.ArrayList


#Declare Table-Class
class Table {
    [String] $name
    [Int] $number
}


#Fill list1
[Int] $i = 0
while ($i -lt 10) {
    $entry = new-Object Table
    $entry.name = "Name";
    $entry.number = $i;
    $list1.Add($entry)
    $i++
}

#Fill list2
[Int] $j = 10
while ($j -gt 0) {
    $entry = new-Object Table
    $entry.name = "name";
    $entry.number = $j;
    $list2.Add($entry)
    $j--
}

现在我想像这样比较这两个ArrayLists:

Compare-Object $list1 $list2 | ForEach-Object {$_.InputObject}

这似乎不起作用,我认为这是因为我并没有真正做任何比较。如果有人能用正确的语法帮助我,我真的很开心。 无论如何,我认为这种比较会以某种方式返回$false布尔值。 如果确实如此,我想按$list2$entry.number进行排序。

我是这样尝试的:

$list2 = $list2 | Sort-Object -Property { $_[1] }

但我的名单根本没有变化。我已经尝试了几种不同的解决方案"但似乎这些都不是真正的解决方案"。

如果有人可以帮助我,或者至少指出我正确的方向,我真的很高兴。

编辑:对于未来的读者,这是工作语法:

#sort list by the property number
$list2 = $list2 | sort-object -Property number

#count differences and if differences greater than 0, do stuff
[Int] $diff
$properties = $list1 | Get-Member -MemberType Property | Select-Object -ExpandProperty Name

foreach ($property in $properties) {
    $diff = 0
    $diff = (Compare-Object $list1 $list2 -Property "$property").count
    if ($diff -ne 0) {
        #do stuff
    }
    else {
        #do something else
    }
}

1 个答案:

答案 0 :(得分:1)

您的排序不起作用,因为-Property希望您传递实际属性的名称。在您的情况下,第二类属性:$name$number。您还可以使用$list2 | Get-Member检查对象具有哪些属性。因此,为了排序,您可以使用:

$list2 = $list2 | Sort-Object -Property number

现在Compare-Object无效的原因是因为它的实现方式与人们预期的不同。请参阅this answer解释其工作原理。

您应该记住另一件事:调用$list2.Add($entry)实际上返回一个整数(插入元素的索引)。 PowerShell返回所有未捕获的输出。如果您不小心,这可能会导致一些意外的行为/输出。所以你应该养成写[void] $list2.Add($entry)的习惯,除非你真的想要返回那些索引。