次のリストは正しくソートされません (IMHO):
$a = @( 'ABCZ', 'ABC_', 'ABCA' )
$a | sort
ABC_
ABCA
ABCZ
私の便利な ASCII チャートと Unicode C0 Controls および Basic Latin チャートには、序数が 95 (U+005F) のアンダースコア (低い線) があります。これは、大文字の AZ よりも大きい数字です。並べ替えは、アンダースコアで終わる文字列を最後に配置する必要がありました。
Get-Culture は 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 型のコレクションであるため、2 つの比較操作は同等である必要があると思います。
そして今、例#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_
2 つの ArrayList には同じ文字列が含まれていますが、並べ替えが異なります。なんで?