Welches ist in der Regel am besten zu nutzen - StringComparison.OrdinalIgnoreCase oder StringComparison.InvariantCultureIgnoreCase?
-
09-06-2019 - |
Frage
Ich habe einige Code wie folgt:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Ich interessiere mich nicht über den Fall. Sollte ich OrdinalIgnoreCase
, InvariantCultureIgnoreCase
oder CurrentCultureIgnoreCase
?
Lösung
Von MSDN „ New Empfehlungen für Streicher in Microsoft .NET 2.0 "
VerwendenZusammenfassung: Code Besitzer selbst mit zuvor die
InvariantCulture
für String-Vergleich, Gehäuse und Sortierung sollte mit einem neuen Satz vonString
Überlastungen in Microsoft .NET 2.0 in Erwägung ziehen. Insbesondere Daten, die als kulturunabhängig konzipiert und sprachlich irrelevant beginnen sollte Überlastungen entweder mit demStringComparison.Ordinal
oderStringComparison.OrdinalIgnoreCase
Mitglieder der neuenStringComparison
Aufzählung angeben. Diese erzwingen einen Byte-für-Byte-Vergleich ähnlich wiestrcmp
, dass nicht nur vermeiden Fehler aus sprachlicher Interpretation der im Wesentlichen symbolischer Saiten, sondern bietet eine bessere Leistung.
Andere Tipps
Es hängt alles
Beim Vergleich Unicode-Strings ist hart:
Die Implementierung von Unicode-Zeichenfolge und Abgleiche in Text Verarbeitungssoftware muss tragen berücksichtigen das Vorhandensein äquivalenter Codepunkte. In Ermangelung dieser Feature, auf der Suche Benutzer für ein bestimmte Codepunktfolge würde nicht in der Lage andere visuell zu finden ununterscheidbar Glyphen, die eine haben unterschiedliche, aber äquivalente kanonisch, Code Punktdarstellung.
siehe: http://en.wikipedia.org/wiki/Unicode_equivalence
Wenn Sie versuchen, zwei Unicode-Strings in einem Fall unempfindlich Art und Weise zu vergleichen und wollen es arbeiten ÜBERALL , haben Sie eine unmögliche Aufgabe.
Das klassische Beispiel ist der Türkisch i , die, wenn sie groß geschrieben wird I (den Punkt bemerken)
In der Standardeinstellung in der Regel der .Net-Framework verwendet die Current Funktionen String im Zusammenhang mit einer sehr wichtigen Ausnahme von .Equals
, die eine Ordnungs (Byte für Byte) verwendet vergleichen.
Dies führt, durch Design, auf die verschiedenen Funktionen String anders verhalten in Abhängigkeit von der Kultur des Computers.
Dennoch manchmal wollen wir ein "general purpose", Groß- und Kleinschreibung, Vergleich.
Zum Beispiel können Sie Ihre String-Vergleich wollen die gleiche Art und Weise verhalten, egal welche Computer die Anwendung installiert ist.
Um dies zu erreichen, haben wir 3 Optionen:
- Stellen Sie die Kultur ausdrücklich und führen Sie einen Groß- und Kleinschreibung vergleichen Unicode Äquivalenzregeln.
- Stellen Sie die Kultur in die unveränderliche Kultur und führen Sie Groß- und Kleinschreibung vergleichen Unicode Äquivalenzregeln.
- Verwenden Sie OrdinalIgnoreCase die den String in Großbuchstaben wird mit die InvariantCulture und führen dann einen Byte für Byte-Vergleich.
Unicode Äquivalenzregeln sind kompliziert, was bedeutet, Verfahren unter Verwendung 1) oder 2) ist teurer als OrdinalIgnoreCase
. Die Tatsache, dass OrdinalIgnoreCase
keine spezielle Unicode-Normalisierung durchführen bedeutet, dass einige Zeichenfolgen, die auf die gleiche Art und Weise auf einem Computerbildschirm machen, nicht identisch betrachtet werden. Zum Beispiel: "\u0061\u030a"
und "\u00e5"
beide å machen. Jedoch in einer Ordnungs vergleichen Ware wird unterschiedlich betrachtet werden.
Was Sie wählen, hängt stark von der Anwendung, die Sie bauen.
- Wenn ich ein Line-of-Business-App zu schreiben, die nur von türkischen Benutzern verwendet wurden, wäre ich sicher Methode 1. verwenden
- Wenn ich nur einen einfachen „fake“ Fall benötigen unempfindlich vergleichen, für sagt ein Spaltenname in einer Db, die in der Regel Englisch ich wahrscheinlich Methode 3. verwenden würde
Microsoft hat ihre mit expliziten Richtlinien. Aber es ist wirklich wichtig, den Begriff der Unicode-Äquivalenz vor der Annäherung an diese Probleme zu verstehen.
Auch beachten Sie bitte, dass OrdinalIgnoreCase ein von Tiere, das heißt Kommissionierung und ein bisschen ein Ordnungs vergleichen mit etwas gemischten in lexikographischen Aspekten der Wahl. Dies kann verwirrend sein.
MSDN macht einige ziemlich klare Empfehlungen dazu: http://msdn.microsoft .com / en-us / library / ms973919.aspx
Ich denke, es auf Ihrer Situation abhängt. Da Ordnungs Vergleiche auf die Zeichen numerischen Unicode-Werte eigentlich auf der Suche sind, werden sie nicht die beste Wahl sein, wenn Sie alphabetisch zu sortier. Bei String-Vergleichen, obwohl würde, Ordnungs ein bisschen schneller sein.
Es hängt davon ab, was Sie wollen, obwohl ich von InvariantCulture scheuen würde, es sei denn du bist sehr sicher, dass Sie nie den Code für andere Sprachen lokalisieren möchten. Verwenden Sie stattdessen Current.
Auch OrdinalIgnoreCase soll Zahlen achten, was sein kann oder auch nicht, was Sie wollen.
Die sehr einfache Antwort ist, es sei denn, Sie Türkisch verwenden, müssen Sie InvariantCulture nicht verwenden.
Sehen Sie den folgenden Link:
In C #, was ist der Unterschied zwischen ToUpper () und ToUpperInvariant ()?