Welches ist am besten zu verwenden – StringComparison.OrdinalIgnoreCase oder StringComparison.InvariantCultureIgnoreCase?

Ich habe einen Code wie folgt:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then DoSomething() End If 

Der Fall interessiert mich nicht. Sollte ich OrdinalIgnoreCase , InvariantCultureIgnoreCase oder CurrentCultureIgnoreCase ?

Von MSDN ” Neue Empfehlungen für die Verwendung von Zeichenfolgen in Microsoft .NET 2.0 ”

Zusammenfassung: Code-Besitzer, die zuvor die InvariantCulture für String-Vergleich, Gehäuse und Sortierung verwenden, sollten die Verwendung einer neuen Gruppe von String-Überladungen in Microsoft .NET 2.0 in Betracht ziehen. Insbesondere sollten Daten, die kulturunabhängig und sprachlich irrelevant sind, mit der Angabe von Überladungen unter Verwendung der StringComparison.Ordinal- oder StringComparison.OrdinalIgnoreCase-Member der neuen StringComparison-Enumeration beginnen. Diese erzwingen einen Byte-für-Byte-Vergleich ähnlich wie strcmp, der nicht nur Fehler bei der linguistischen Interpretation von im Wesentlichen symbolischen Zeichenfolgen vermeidet, sondern auch eine bessere performance bietet. (15 gedruckte Seiten)

Es hängt alles ab

Der Vergleich von Unicode-Strings ist schwierig:

Die Implementierung von Unicode-String-Suchen und Vergleichen in Textverarbeitungssoftware muss das Vorhandensein äquivalenter Codepunkte berücksichtigen. Ohne dieses Merkmal könnten Benutzer, die nach einer bestimmten Codepunktsequenz suchen, keine anderen visuell unterscheidbaren Zeichen finden, die eine andere, aber kanonisch äquivalente Codepunktdarstellung haben.

siehe: http://en.wikipedia.org/wiki/Unicode_equivalence


Wenn Sie versuchen, 2 Unicode-Strings ohne Berücksichtigung der Groß- / Kleinschreibung zu vergleichen und wollen, dass sie ÜBERALL funktioniert, haben Sie ein unmögliches Problem.

Das klassische Beispiel ist das Türkische i , das, wenn es sich in Großbuchstaben verwandelt, zu © wird (beachte den Punkt)

Standardmäßig verwendet das .NET-Framework normalerweise CurrentCulture für string-bezogene functionen, mit einer sehr wichtigen Ausnahme von .Equals , die einen .Equals (Byte für Byte) verwenden.

Dies führt dazu, dass sich die verschiedenen String-functionen je nach der Kultur des Computers unterschiedlich verhalten.


Trotzdem wollen wir manchmal einen Vergleich zwischen “case insensitive” und “general purpose”.

Beispielsweise möchten Sie möglicherweise, dass sich der Zeichenfolgenvergleich auf die gleiche Weise verhält, unabhängig davon, auf welchem ​​Computer Ihre Anwendung installiert ist.

Um dies zu erreichen, haben wir 3 Möglichkeiten:

  1. Setzen Sie die Kultur explizit und führen Sie einen Groß- / Kleinschreibungsvergleich mit Unicode-Äquivalenzregeln durch.
  2. Setzen Sie die Kultur auf Invariant Culture und führen Sie einen Groß- / Kleinschreibungsvergleich mit Unicode-Äquivalenzregeln durch.
  3. Verwenden Sie OrdinalIgnoreCase, das die Zeichenfolge mit der InvariantCulture in Großbuchstaben eingibt , und führen Sie dann einen Byte-für-Byte-Vergleich durch.

Unicode-Äquivalenzregeln sind kompliziert, was bedeutet, dass die Verwendung von Methode 1) oder 2) teurer ist als OrdinalIgnoreCase . Die Tatsache, dass OrdinalIgnoreCase keine spezielle Unicode-Normalisierung durchführt, bedeutet, dass einige Zeichenfolgen, die auf dem Computerbildschirm auf die gleiche Weise dargestellt werden, nicht als identisch betrachtet werden. Zum Beispiel: "\u0061\u030a" und "\u00e5" rendern beide å. In einem Ordinalvergleich wird dies jedoch als unterschiedlich angesehen.

Welche Sie wählen, hängt stark von der Anwendung ab, die Sie erstellen.

  • Wenn ich eine Line-of-Business-App schreiben würde, die nur von türkischen Benutzern verwendet wird, würde ich sicher Methode 1 verwenden.
  • Wenn ich nur einen einfachen “fake” case insensitive compare benötige, zB einen Spaltennamen in einer db, der normalerweise Englisch ist, würde ich wahrscheinlich Methode 3 verwenden.

Microsoft hat seine Empfehlungen mit expliziten Richtlinien. Es ist jedoch sehr wichtig, den Begriff der Unicode-Äquivalenz zu verstehen, bevor man sich diesen Problemen nähert.

Bedenken Sie auch, dass OrdinalIgnoreCase eine ganz besondere Art von Biest ist, die ein bisschen Ordnungszahl auswählt und mit einigen gemischt lexikographischen Aspekten vergleicht. Dies kann verwirrend sein.

MSDN gibt einige ziemlich klare Empfehlungen dazu: http://msdn.microsoft.com/en-us/library/ms973919.aspx

Ich schätze, das hängt von deiner Situation ab. Da Ordnungsvergleiche tatsächlich die numerischen Unicode-Werte der Zeichen betrachten, sind sie nicht die beste Wahl, wenn Sie alphabetisch sortieren. Bei String-Vergleichen wäre die Ordinalzahl jedoch etwas schneller.

Es hängt davon ab, was Sie wollen, obwohl ich mich vor invarianter Kultur scheue, wenn Sie nicht sicher sind, dass Sie den Code für andere Sprachen nie mehr lokalisieren wollen. Benutze stattdessen CurrentCulture.

Außerdem sollte OrdinalIgnoreCase Zahlen berücksichtigen, die möglicherweise nicht Ihren Vorstellungen entsprechen.

Die einfachste Antwort ist, dass Sie InvariantCulture nicht verwenden müssen, es sei denn, Sie verwenden Türkisch.

Siehe folgenden Link:

In C # Was ist der Unterschied zwischen ToUpper () und ToUpperInvariant ()?