L'elenco che segue non sorta correttamente (IMHO):Powershell sorta di stringhe di sottolineatura
$a = @('ABCZ', 'ABC_', 'ABCA')
$a | sort
ABC_
ABCA
ABCZ
mia tabella ASCII a portata di mano e Unicode C0 controlli e il grafico Latino di base hanno la sottolineatura (linea bassa) con un numero ordinale di 95 (U + 005F). Questo è un numero più alto delle lettere maiuscole A-Z. Sort dovrebbe avere messo la stringa che termina con un carattere di sottolineatura.
Get-Culture è en-US
La prossima serie di comandi fa quello che mi aspetto:
$a = @('ABCZ', 'ABC_', 'ABCA')
[System.Collections.ArrayList] $al = $a
$al.Sort([System.StringComparer]::Ordinal)
$al
ABCA
ABCZ
ABC_
Ora creo un file codificato ANSI contenente quelle stesse 3 stringhe:
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
Ancora una volta la stringa che contiene il carattere di sottolineatura/linea di basso non è ordinata correttamente. Cosa mi manca?
Edit: riferimento
Let questo esempio # 4:
'A' -lt '_'
False
[char] 'A' -lt [char] '_'
True
Sembra come entrambe le dichiarazioni devono essere false o entrambi dovrebbero essere vero. Sto confrontando le stringhe nella prima istruzione e poi confrontando il tipo Char. Una stringa è semplicemente una raccolta di tipi Char, quindi penso che le due operazioni di confronto dovrebbero essere equivalenti.
E ora, per esempio # 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_
I due ArrayList contengono le stesse stringhe, ma sono ordinati in modo diverso. Perché?
Penso che quello che ti manca è che ti aspetti risposte non standard da Windows. Ha sempre dato la priorità ai simboli prima delle lettere, basta guardare il file system. Crea file con questi nomi, ordina per nome, e li ordinerà allo stesso modo con ABC_ come prima cosa. – TheMadTechnician
[L'ordinamento delle stringhe non viene più eseguito dal codice ASCII.] (Http://blogs.msdn.com/b/oldnewthing/archive/2004/05/18/134051.aspx) –
Anche per quanto posso dire la stranezza con la seconda parte ha qualcosa a che fare con 'ArrayList'. L'uso di un 'String.Collections.Generic.List [string] fortemente digitato' ordina come previsto. Inoltre, usando un ordinamento 'string []' come previsto con 'Array :: Sort', ma' object [] 'no. –