以下列表未正确排序(恕我直言):
$a = @( 'ABCZ', 'ABC_', 'ABCA' )
$a | sort
ABC_
ABCA
ABCZ
我方便的 ASCII 图表和 Unicode C0 控件和基本拉丁图表有下划线(低线),序数为 95 (U+005F)。这是一个高于大写字母 AZ 的数字。排序应该将以下划线结尾的字符串放在最后。
Get-Culture is en-US
下一组命令符合我的预期:
$a = @( 'ABCZ', 'ABC_', 'ABCA' )
[System.Collections.ArrayList] $al = $a
$al.Sort( [System.StringComparer]::Ordinal )
$al
ABCA
ABCZ
ABC_
现在我创建一个包含相同 3 个字符串的 ANSI 编码文件:
Get-Content -Encoding Byte data.txt
65 66 67 90 13 10 65 66 67 95 13 10 65 66 67 65 13 10
$a = Get-Content data.txt
[System.Collections.ArrayList] $al = $a
$al.Sort( [System.StringComparer]::Ordinal )
$al
ABC_
ABCA
ABCZ
再一次,包含下划线/下划线的字符串没有正确排序。我错过了什么?
编辑:
让我们参考这个例子#4:
'A' -lt '_'
False
[char] 'A' -lt [char] '_'
True
似乎两个陈述都应该是 False 或者两者都应该是 True。我在第一个语句中比较字符串,然后比较 Char 类型。字符串只是 Char 类型的集合,所以我认为这两个比较操作应该是等价的。
现在例如#5:
Get-Content -Encoding Byte data.txt
65 66 67 90 13 10 65 66 67 95 13 10 65 66 67 65 13 10
$a = Get-Content data.txt
$b = @( 'ABCZ', 'ABC_', 'ABCA' )
$a[0] -eq $b[0]; $a[1] -eq $b[1]; $a[2] -eq $b[2];
True
True
True
[System.Collections.ArrayList] $al = $a
[System.Collections.ArrayList] $bl = $b
$al[0] -eq $bl[0]; $al[1] -eq $bl[1]; $al[2] -eq $bl[2];
True
True
True
$al.Sort( [System.StringComparer]::Ordinal )
$bl.Sort( [System.StringComparer]::Ordinal )
$al
ABC_
ABCA
ABCZ
$bl
ABCA
ABCZ
ABC_
这两个 ArrayList 包含相同的字符串,但排序方式不同。为什么?