String-Sortierung in C #

Ich habe eine Liste wie diese

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); 

Die Ausgabe kommt als zurück

 - . a- aaa aa 

wo ich die Ergebnisse als erwartet habe

 - . a- a. aa aa 

Irgendeine Idee, warum “aa” nicht vor “aa” kommt, wo “a-” vor “a” steht.

Wenn Sie möchten, dass Ihre String-Sortierung auf dem tatsächlichen Byte-Wert basiert, im Gegensatz zu den Regeln, die von der aktuellen Kultur definiert sind, können Sie nach Ordinal sortieren:

items.Sort(StringComparer.Ordinal);

Dies wird die Ergebnisse über alle Kulturen hinweg konsistent machen (aber es wird unintuitive Sortierungen von “14” ergeben, die vor “9” kommen, was vielleicht das ist, wonach Sie suchen).

Ich vermute, dass im letzten Fall “-” aufgrund kulturspezifischer Einstellungen anders behandelt wird (vielleicht als “Strich” im Gegensatz zu “Minus” in den ersten Strings). MSDN warnt davor:

Der Vergleich verwendet die aktuelle Kultur, um kulturspezifische Informationen wie Casing-Regeln und die alphabetische Reihenfolge einzelner Zeichen zu erhalten. Zum Beispiel könnte eine Kultur angeben, dass bestimmte Kombinationen von Zeichen als ein einzelnes Zeichen behandelt werden oder Groß- und Kleinbuchstaben in einer bestimmten Weise verglichen werden oder dass die Sortierreihenfolge eines Zeichens von den Zeichen abhängt, die ihm vorangehen oder ihm folgen.

Siehe auch auf dieser MSDN-Seite :

Das .NET Framework verwendet drei verschiedene Sortiermethoden: Wortsortierung, Zeichenfolgensortierung und Ordnungssortierung. Wortsortierung führt einen kultursensitiven Vergleich von Zeichenfolgen durch. Bestimmte nicht-alphanumerische Zeichen können spezielle Gewichtungen zugewiesen bekommen; Zum Beispiel kann dem Bindestrich (“-“) ein sehr geringes Gewicht zugewiesen werden, so dass “coop” und “co-op” nebeneinander in einer sortierten Liste erscheinen. String sort ist dem Wort sort ähnlich, außer dass es keine speziellen Fälle gibt. Daher stehen alle nicht-alphanumerischen Symbole vor allen alphanumerischen Zeichen. Bei der Ordnungssortierung werden Zeichenfolgen basierend auf den Unicode-Werten jedes Elements der Zeichenfolge verglichen.

Daher wird Bindestrich im Standard-Sortiermodus behandelt, um das Wort “natürlicher” zu sortieren.

Sie können die “normale” Ordnungssortierung erhalten, wenn Sie sie explizit aktivieren:

  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 

Verwenden Sie zum Sortieren der ursprünglichen Sammlung mithilfe des Ordnungsvergleichs Folgendes:

  items.Sort(StringComparer.Ordinal); 

Die Sort Methode der List<> -class basiert auf dem Standardzeichenfolgenvergleich von .NET Framework, der tatsächlich eine Instanz der aktuellen CultureInfo des Thread .

Die CultureInfo gibt die alphabetische Reihenfolge der Zeichen an und es CultureInfo so aus, als ob die Standard-Reihenfolge eine andere Reihenfolge verwendet als erwartet.

Beim Sortieren können Sie eine spezifische CultureInfo angeben, von der Sie wissen, dass sie Ihren Sortieranforderungen entspricht, Beispiel (deutsche Kultur):

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

Weitere Informationen finden Sie hier:
http://msdn.microsoft.com/en-us/library/b0zbh7b6.aspx
http://msdn.microsoft.com/de-de/library/system.stringcomparer.aspx