Следующий список не сортируется должным образом (IMHO):
$a = @( 'ABCZ', 'ABC_', 'ABCA' )
$a | sort
ABC_
ABCA
ABCZ
Моя удобная диаграмма ASCII и элементы управления Unicode C0 и базовая латинская диаграмма имеют нижнюю границу (нижняя строка) с порядковым номером 95 (U + 005F). Это больше, чем заглавные буквы A-Z. Сортировка должна была бы поместить строку, заканчивающуюся последним символом подчеркивания.
Get-Culture - en-US
Следующий набор команд делает то, что я ожидаю:
$a = @( 'ABCZ', 'ABC_', 'ABCA' )
[System.Collections.ArrayList] $al = $a
$al.Sort( [System.StringComparer]::Ordinal )
$al
ABCA
ABCZ
ABC_
Теперь я создаю ANSI-кодированный файл, содержащий те же 3 строки:
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
Еще раз строка, содержащая символ подчеркивания/нижней линии, не отсортирована правильно. Что мне не хватает?
Edit:
Позвольте ссылаться на этот пример # 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 содержат одни и те же строки, но отсортированы по-разному. Почему?