在散列表数组上使用Sort-Object

Hut*_*tch 4 sorting powershell powershell-2.0

在PowerShell(版本2)中创建以下哈希表数组后:

$array = @()
$array += @{a = 1; b = 5}
$array += @{a = 3; b = 4}
$array += @{a = 5; b = 9}
$array += @{a = 7; b = 2}
Run Code Online (Sandbox Code Playgroud)

对Sort-Object的所有以下调用都返回相同的{a,b}序列:{5,9},{7,2},{1,5},{3,4}:

$array | Sort-Object
$array | Sort-Object -Descending
$array | Sort-Object a
$array | Sort-Object b
$array | Sort-Object "a"
$array | Sort-Object -Property a
$array.GetEnumerator() | Sort-Object
$array.GetEnumerator() | Sort-Object a
Run Code Online (Sandbox Code Playgroud)

如果$array直接调用它,它将按照输入的顺序返回对象,因此排序正在改变顺序.但也许它没有比较器所以只是把每个对象视为平等?

目标是对所有对象进行排序.我很好地处理涉及备用自定义对象,备用集合和/或备用排序例程的变通方法.

编辑:为了澄清我想要实现的目标,这将是C#中的一个粗略的等价物

class MyClass {
    public int a;
    public int b;
}

// somewhere inside a method:
var objects = new List<MyClass>();
// code here to populate objects with some MyClass instances.
var sorted = objects.OrderBy(x => x.a);
Run Code Online (Sandbox Code Playgroud)

Fro*_* F. 6

Sort-Object a因为a不是属性而无法工作,它是哈希表中的键.有人可能会感到困惑,因为PowerShell通过接受来隐藏这个,$ht.a即使它实际上$ht["a"]在幕后使用,但如果你运行,$array | Get-Member你可以确认该属性a不存在.

解决方法是使用访问哈希表中的键的计算属性进行排序.我曾经Select-Object在表格中显示哈希表,因此更容易看到结果.例如:

$array = @()
$array += @{a = 7; b = 2}
$array += @{a = 3; b = 4}
$array += @{a = 3; b = 1}
$array += @{a = 5; b = 9}
$array += @{a = 1; b = 5}

#No sort
$array | Select-Object @{n="a";e={$_.a}}, @{n="b";e={$_.b}}

a b
- -
7 2
3 4
3 1
5 9
1 5

#Sort by a asc, then b asc
$array | Sort-Object { $_.a },  { $_.b } | Select-Object @{n="a";e={$_.a}}, @{n="b";e={$_.b}}

a b
- -
1 5
3 1
3 4
5 9
7 2
Run Code Online (Sandbox Code Playgroud)