Was ist der Unterschied zwischen InvariantCulture und Ordinal-Vergleich beim Vergleich zweier Strings in c# auf Gleichheit?
Antworten
Zu viele Anzeigen?Unveränderlich ist eine sprachlich angemessene Art des Vergleichs.
Ordinal ist ein binärer Vergleichstyp. (schneller)
Siehe http://www.siao2.com/2004/12/29/344136.aspx
Hier ist ein Beispiel, bei dem der Vergleich der Zeichenfolgengleichheit unter Verwendung von InvariantCultureIgnoreCase und OrdinalIgnoreCase nicht zu denselben Ergebnissen führt:
string str = "\xC4"; //A with umlaut, Ä
string A = str.Normalize(NormalizationForm.FormC);
//Length is 1, this will contain the single A with umlaut character (Ä)
string B = str.Normalize(NormalizationForm.FormD);
//Length is 2, this will contain an uppercase A followed by an umlaut combining character
bool equals1 = A.Equals(B, StringComparison.OrdinalIgnoreCase);
bool equals2 = A.Equals(B, StringComparison.InvariantCultureIgnoreCase);
Wenn Sie dies ausführen, wird equals1 falsch und equals2 wahr sein.
Es ist nicht nötig, ausgefallene Unicode-Zeichen-Beispiele zu verwenden, um den Unterschied zu verdeutlichen. Hier ist ein einfaches Beispiel, das ich heute herausgefunden habe und das überraschend ist, da es nur aus ASCII-Zeichen besteht.
Gemäß der ASCII-Tabelle, 0
(48, 0x30) ist kleiner als _
(95, 0x5F) im ordinalen Vergleich. InvariantCulture würde das Gegenteil behaupten (PowerShell-Code unten):
PS> [System.StringComparer]::Ordinal.Compare("_", "0")
47
PS> [System.StringComparer]::InvariantCulture.Compare("_", "0")
-1
Versuchen Sie immer, InvariantCulture in den String-Methoden zu verwenden, die es als Überladung akzeptieren. Wenn Sie InvariantCulture verwenden, sind Sie auf der sicheren Seite. Viele .NET-Programmierer nutzen diese Funktionalität vielleicht nicht, aber wenn Ihre Software von verschiedenen Kulturen genutzt wird, ist InvariantCulture eine äußerst praktische Funktion.
- See previous answers
- Weitere Antworten anzeigen
0 Stimmen
Vielleicht siao2.com/2004/12/29/344136.aspx ? (gegoogelt)
3 Stimmen
Für diejenigen, die
String1.Equals(String2, StringComparison.Ordinal)
verwenden Sie besserString1 == String2
die von Haus ausString1.Equals(String2)
und ist standardmäßig ein ordinaler Vergleich unter Berücksichtigung der Groß- und Kleinschreibung.3 Stimmen
@Ghasan Ich bin nicht sicher, ob das etwas bringt.
==
"besser", aber er ist a) kürzer, b) weniger eindeutig in Bezug auf seine genaue Funktion und c)String1
Null sein kann, ohne dass der Vergleich einNullReferenceException
.5 Stimmen
@Ghasan der offizielle MSDN Bewährte Praktiken für die Verwendung von Strings im .NET Framework Seite ( msdn.microsoft.com/de-us/library/ ) empfiehlt die Verwendung von Überladungen, die explizit die
StringComparison
Typ. Im Falle des String-Vergleichs bedeutet diesString.Equals
.3 Stimmen
@EugeneBeresovsky Zu vermeiden
NullReferenceException
können Sie einfach die statische Methode verwenden:String.Equals(string1, string2, StringComparison.Ordinal)
.