La liste suivante ne trie pas correctement (à mon humble avis):Powershell Trier de chaînes par des underscores
$a = @('ABCZ', 'ABC_', 'ABCA')
$a | sort
ABC_
ABCA
ABCZ
Mon tableau ASCII pratique et Unicode Commandes C0 et carte de base latine ont le trait de soulignement (ligne basse) avec un ordinal de 95 (U + 005F). C'est un nombre plus élevé que les lettres majuscules A-Z. Le tri aurait dû mettre la fin de la chaîne avec un trait de soulignement en dernier.
Get-Culture est en-US
La prochaine série de commandes fait ce que je pense:
$a = @('ABCZ', 'ABC_', 'ABCA')
[System.Collections.ArrayList] $al = $a
$al.Sort([System.StringComparer]::Ordinal)
$al
ABCA
ABCZ
ABC_
Maintenant, je crée un fichier codé ANSI contenant les mêmes 3 chaînes:
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
Une fois de plus, la chaîne contenant le trait de soulignement/ligne de fond n'est pas triée correctement. Qu'est-ce que je rate?
Edit:
Soit Référence cet exemple # 4:
'A' -lt '_'
False
[char] 'A' -lt [char] '_'
True
On dirait que les deux déclarations doivent être faux ou les deux doivent être vrai. Je compare les chaînes dans la première déclaration, puis je compare le type Char. Une chaîne est simplement une collection de types Char, donc je pense que les deux opérations de comparaison devraient être équivalentes.
Et maintenant, par exemple # 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_
Les deux ArrayList contiennent les mêmes chaînes, mais sont triées différemment. Pourquoi?
Je pense que ce qui vous manque, c'est que vous attendez des réponses non standard de Windows. Il a toujours priorisé les symboles avant les lettres, il suffit de regarder le système de fichiers. Créez des fichiers avec ces noms, triez-les par nom, et ils seront triés de la même façon avec ABC_ en premier. – TheMadTechnician
[Le tri des chaînes n'est plus effectué par le code ASCII.] (Http://blogs.msdn.com/b/oldnewthing/archive/2004/05/18/134051.aspx) –
Aussi, autant que je sache, bizarrerie avec la deuxième partie a quelque chose à voir avec 'ArrayList'. Utiliser un 'String.Collections.Generic.List [chaîne]' fortement typé 'trie comme prévu. De plus, utiliser 'string []' est comme prévu avec 'Array :: Sort', mais' object [] 'non. –