2016-09-08 1 views
3

Ich möchte wissen, wie CompareTo Methode von C# zwei Strings vergleicht, so dass ich wie folgt getestet:Wie C# compareTo-Methode vergleicht Strings

string str1 = "0"; 
string str2 = "-"; 
Console.WriteLine(str1.CompareTo(str2)); // output : 1 
string str3 = "01"; 
string str4 = "-1"; 
Console.WriteLine(str3.CompareTo(str4)); // output : -1 

Warum die Ergebnisse unterschiedlich sind?

+0

Es nutzt 'CultureInfo.CurrentCulture .CompareInfo.Compare', also bestimmen die Kultureinstellungen die Sortierreihenfolge, aber die Ergebnisse sehen sehr seltsam aus. –

Antwort

5

TLDR: Die standardmäßige lexikographische Zeichenkettenordnung behandelt - Zeichen speziell.

Die Antwort darauf ist, dass der Standard-String-Vergleich lexikografische Sortierregeln verwendet.

Dies bedeutet, dass einige Symbole, z. B. -, speziell behandelt werden.

The documentation for CompareOptions Zustände:

Das .NET Framework verwendet drei verschiedene Möglichkeiten der Sortierung: Wort sortieren, String sortieren und Ordnungs sortieren. Wortsortierung führt einen kultursensitiven Vergleich der Zeichenfolgen durch. Bestimmte nicht-alphanumerische Zeichen können spezielle Gewichtungen zugewiesen haben. Zum Beispiel könnte der Bindestrich ("-") ein sehr kleines Gewicht zugewiesen bekommen, so dass "coop" und "co-op" nebeneinander in einer sortierten Liste erscheinen. String sort ist ähnlich wie world sort, außer dass es keine speziellen Fälle gibt. Daher stehen alle nicht alphanumerischen Symbole vor allen alphanumerischen Zeichen. Ordinale Sortierung vergleicht Zeichenfolgen basierend auf den Unicode-Werten jedes Elements der Zeichenfolge.

In Ihrem Fall wird die Standardreihenfolge verwendet: Wortsortierung.

Sie können die verschiedenen Ergebnisse sehen, indem Sie die Art des Vergleichs spezifizieren Sie in string.Compare() wollen:

string str3 = "01"; 
string str4 = "-1"; 
Console.WriteLine(Math.Sign(string.Compare(str3, str4, StringComparison.InvariantCulture))); // output : -1 
Console.WriteLine(Math.Sign(string.Compare(str3, str4, StringComparison.Ordinal)));   // output : 1 

Hier können Sie sehen, dass es die - speziell behandelt, wenn sie nicht einen Ordinalvergleich tun.

Es ist wirklich die -, die speziell behandelt wird - es geht nicht davon aus, dass es ein Minuszeichen ist. Zum Beispiel, wenn Sie + statt - benutzen Sie erhalten:

string str1 = "0"; 
string str2 = "+"; 
Console.WriteLine(Math.Sign(string.Compare(str1, str2, StringComparison.InvariantCulture))); // output : 1 
Console.WriteLine(Math.Sign(string.Compare(str1, str2, StringComparison.Ordinal)));   // output : 1 
string str3 = "01"; 
string str4 = "+1"; 
Console.WriteLine(Math.Sign(string.Compare(str3, str4, StringComparison.InvariantCulture))); // output : 1 
Console.WriteLine(Math.Sign(string.Compare(str3, str4, StringComparison.Ordinal)));   // output : 1 

ASIDE

Sie einen normalen Bindestrich mit einem weichen Bindestrich nicht verwechseln!

  • Ein normaler Bindestrich hat den Unicode-Wert \u002D. Ein weicher Bindestrich hat den Unicode-Wert \u00AD.

Hinweis the documentation for string.Compare() die Beispielcode hat, die eine weiche Bindestrich zeigt ignoriert.Die Dokumentation besagt:

Zeichensätze enthalten ignorierbare Zeichen. Die Compare (String, String, Boolean) -Methode berücksichtigt solche Zeichen nicht, wenn sie einen kultursensitiven Vergleich durchführt.

A weichen Bindestrich ist eine der ignorable Zeichen, aber es ist wichtig zu beachten, dass ein weicher Bindestrich nicht das gleiche wie ein normaler Bindestrich ist. Diese Dokumentation gilt also nicht für Ihren Beispielcode.

Der eigentliche Grund für die normalen Bindestrich verhält sich anders ist oben angegeben.

(Wenn Sie eine vollständige Liste aller ignorable Zeichen in Unicode wollen, für Default_Ignorable_Code_Point gehen zu http://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt und suchen -. Und beachten Sie, dass diese Liste in der Tat nicht den normalen Bindestrich enthalten)