729 Stimmen

Unterschied zwischen InvariantCulture und Ordinal String-Vergleich

Was ist der Unterschied zwischen InvariantCulture und Ordinal-Vergleich beim Vergleich zweier Strings in c# auf Gleichheit?

0 Stimmen

Vielleicht siao2.com/2004/12/29/344136.aspx ? (gegoogelt)

3 Stimmen

Für diejenigen, die String1.Equals(String2, StringComparison.Ordinal) verwenden Sie besser String1 == String2 die von Haus aus String1.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 ein NullReferenceException .

32voto

DanH Punkte 2413

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

8voto

Dwedit Punkte 526

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.

4voto

KFL Punkte 15635

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

-9voto

George Punkte 161

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X