Estou tentando ordenar uma sequência de letras utilizando o Order
operador LINQ e não estou obtendo o resultado esperado. Eu esperava que passar the StringComparer.CurrentCulture
produzisse uma ordem diferente da passagem the StringComparer.CurrentCultureIgnoreCase
, mas ambos parecem ignorar o caso das minhas cartas:
string[] letters = ["y", "X", "Z"];
Console.WriteLine(String.Join(", ", letters.Order(StringComparer.CurrentCulture)));
Console.WriteLine(String.Join(", ", letters.Order(StringComparer.CurrentCultureIgnoreCase)));
Saída:
X, y, Z
X, y, Z
Eu esperava que CurrentCulture
fosse sensível ao caso das letras e produzisse esta ordem: X, Z, y
, porque as letras minúsculas em inglês estão mais distantes no gráfico ASCII do que as letras maiúsculas em inglês. O que não estou entendendo corretamente?
A diferença entre
StringComparer.CurrentCulture
eStringComparer.CurrentCultureIgnoreCase
é relevante quando você tem dois valores que possuem a mesma string/texto, mas podem ter casos diferentes. No seu exemplo,["y", "X", "Z"]
as strings são todas "diferentes", pois "x" ainda vem antes de "y" e "y" ainda vem antes de "z". E isso não tem nada a ver com os casos dessas strings.Mas quando o algoritmo de ordenação vê uma lista como
["x", "X", "X", "x", "x", "X"]
há uma diferença se os valores"x"
e"X"
devem ser iguais em relação à ordenação (então oCompare()
método retorna0
) ou se devem ser diferentes (então oCompare()
método retornará-1
/1
ou qualquer outro valor menor/maior zero ).Quando você usa o seguinte código:
você obterá o seguinte resultado :
Na segunda linha, todas as letras "iguais" são iguais entre si, o caso é literalmente ignorado conforme as instruções. E como o algoritmo de classificação é estável , a ordem relativa das "mesmas" letras ainda está na mesma ordem original (aqui na letra "y"):
Pelo que entendi, isso acontece porque esses comparadores realizam comparações linguísticas :
E você esperava o ordinal.
Dos documentos :
Daí a mudança para as contrapartes oridnais:
Resultará na saída esperada:
Demonstração @sharplab.io