2011-01-12 14 views
19

Von ihren kurzen zusammenfassenden Beschreibungen, es klingt wie die String-Vergleichsregeln StringComparison.Ordinal und StringComparison.InvariantCulture sind in der Art und Weise, wie sie tun Sortierung von Strings unterscheiden. Ist das alle? h., bedeutet das, dass wir eine Zeichenkettenvergleichsregel verwenden können, wenn wir einen Gleichheitsvergleich durchführen?ist StringComparison.Ordinal das gleiche wie InvariantCulture zum Testen der Gleichheit?

string.Equals(a, b, StringComparison....) 

Und für zusätzliche Kredite: macht es einen Unterschied zu der Antwort, wenn wir OrdinalIgnoreCase und InvariantCultureIgnoreCase vergleichen? Wie?

Bitte unterstützende Argumente und/oder Referenzen angeben.

+2

Kultur ist wichtig für case-invariante Vergleiche, da einige Sprachen seltsame Groß-/Kleinschreibung haben. Zum Beispiel Türkisch mit seinen zwei unteren und zwei Großbuchstaben "i", die cross-over sind. – CodesInChaos

Antwort

19

es keine Rolle spielt, zum Beispiel - es gibt eine Sache Charakter Expansion genannt

var s1 = "Strasse"; 
    var s2 = "Straße"; 

    s1.Equals(s2, StringComparison.Ordinal);   // false 
    s1.Equals(s2, StringComparison.InvariantCulture); // true 

Mit InvariantCulture der ß Charakter ss erweitert wird.

+0

Ja, aber die Frage war über InvariantCulture, nicht über CurrentCulture. –

+0

@ TimLovell-Smith - behoben mein Beispiel - noch gültig – Bond

+1

Wow, danke für eine tolle und aufschlussreiche Antwort! Ich musste deine Probe ausprobieren, ich habe auch versucht, was passiert, wenn IgnoreCase eingeschaltet ist. IgnoreCase macht für dieses Beispiel keinen Unterschied. –

5

Nun, es ist sicherlich wichtig. Wenn Sie einen Gleichheitsvergleich "Groß- und Kleinschreibung ignorieren" verwenden, rufen Sie einen ziemlich großen Codeabschnitt im .NET-Framework auf, der sich der Funktionsweise von Übergaberegeln in der aktuellen Kultur bewusst ist. Die Regeln, die für einen ehemaligen Briefmarkensammler-Geek wie mich sehr interessant sind, dort sind einige ziemlich ungerade-Ball-Regeln abhängig davon, wohin Sie schauen. Das Turkish I-Problem ist berühmt, die Unicode-Typen mussten für sie eine explizite Ausnahme machen.

Es ist nicht wirklich Code BTW, es ist Lookup-Tabellen. Interessant an sich, da MSFT die Befehlszeilenoption/linkres für den C# -Compiler beibehalten muss. Eine Kompilierungsoption, die Sie nicht in Ihren eigenen Projekten verwenden können. Es ist nur da, um mscorlib zu bekommen, um die .nlp-Dateien zu finden, die Umwandlungstabellen für Kulturregeln. Gespeichert im selben Unterverzeichnis des GAC als mscorlib.dll, der Effekt der Kompilieroption.

Aber ich schweife ab. Es liegt nahe, dass StringComparison.OrdinalIgnoreCase ein kleines bisschen schneller ist als StringComparison.InvariantCultureIgnoresCase. Nur weil "invariant" USA bedeutet, Heimat von MSFT. Schwer zu messen, taktet dies in Nanosekunden. StringComparison.CurrentCultureIgnoreCase trifft diese Übersetzungstabellen. Dead langsam, wenn Sie es zuerst verwenden, nur langsamer, wenn Sie sie später verwenden.

+1

+1 Interessant! –

4

Für die zusätzliche Kredit Frage

Verwandte Themen