Problema de sorting de cadeia em c #

Eu tenho lista como esta

List items = new List(); items.Add("-"); items.Add("."); items.Add("a-"); items.Add("a."); items.Add("aa"); items.Add("aa"); items.Sort(); string output = string.Empty; foreach (string s in items) { output += s + Environment.NewLine; } MessageBox.Show(output); 

A saída está voltando como

 - . a- aaa aa 

onde como eu estou esperando os resultados como

 - . a- a. aa aa 

Qualquer idéia por que “aa” não vem antes de “aa”, onde “a-” vem antes de “a”.

Se você quiser que sua sorting seja baseada no valor real do byte, em oposição às regras definidas pela cultura atual, você pode ordenar por Ordinal:

items.Sort(StringComparer.Ordinal);

Isso tornará os resultados consistentes em todas as culturas (mas produzirá sortimentos não intuitivos de “14” antes de “9”, que podem ou não ser o que você está procurando).

Eu suspeito que no último caso “-” é tratado de uma maneira diferente devido a configurações específicas da cultura (talvez como um “traço” em oposição a “menos” nas primeiras seqüências de caracteres). MSDN avisa sobre isso:

A comparação usa a cultura atual para obter informações específicas de cultura, como regras de maiúsculas e minúsculas e a ordem alfabética de caracteres individuais. Por exemplo, uma cultura pode especificar que certas combinações de caracteres sejam tratadas como um único caractere, ou caracteres maiúsculos e minúsculos sejam comparados de uma maneira particular, ou que a ordem de sorting de um caractere dependa dos caracteres que o precedem ou sigam.

Veja também nesta página do MSDN :

O .NET Framework usa três maneiras distintas de sorting: palavra sort, string sort e ordinal sort. A ordenação do Word executa uma comparação de cadeias de caracteres sensível à cultura. Certos caracteres não alfanuméricos podem ter pesos especiais atribuídos a eles; por exemplo, o hífen (“-“) pode ter um peso muito pequeno atribuído a ele para que “coop” e “co-op” apareçam lado a lado em uma lista classificada. A sequência de strings é semelhante à ordenação de palavras, exceto que não há casos especiais; portanto, todos os símbolos não alfanuméricos vêm antes de todos os caracteres alfanuméricos. Ordinal sort compara strings com base nos valores Unicode de cada elemento da string.

Assim, o hífen recebe um tratamento especial no modo de sorting padrão para tornar a palavra mais “natural”.

Você pode obter ordenação ordinal “normal” se ativá-la especificamente:

  Console.WriteLine(string.Compare("a.", "a-")); //1 Console.WriteLine(string.Compare("aa", "aa")); //-1 Console.WriteLine(string.Compare("a.", "a-", StringComparison.Ordinal)); //1 Console.WriteLine(string.Compare("aa", "aa", StringComparison.Ordinal)); //1 

Para classificar a coleção original usando o uso de comparação ordinal:

  items.Sort(StringComparer.Ordinal); 

O método Sort da class List<> depende do comparador de string padrão do .NET Framework, que é na verdade uma instância do CultureInfo atual do Thread .

O CultureInfo especifica a ordem alfabética dos caracteres e parece que o padrão está usando uma ordem diferente para o que você esperaria.

Ao classificar você pode especificar um CultureInfo específico, que você sabe que irá corresponder aos seus requisitos de sorting, amostra (cultura alemã):

 var sortCulture = new CultureInfo("de-DE"); items.Sort(sortCulture); 

Mais informações podem ser encontradas aqui:
http://msdn.microsoft.com/pt-br/library/b0zbh7b6.aspx
http://msdn.microsoft.com/de-de/library/system.stringcomparer.aspx