Welches ist in der Regel am besten zu nutzen - StringComparison.OrdinalIgnoreCase oder StringComparison.InvariantCultureIgnoreCase?

StackOverflow https://stackoverflow.com/questions/72696

  •  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?

War es hilfreich?

Lösung

Neuere .Net Docs hat jetzt eine Tabelle, die Sie entscheiden, welche am besten in Ihrer Situation verwenden.

Von MSDN „ New Empfehlungen für Streicher in Microsoft .NET 2.0 "

Verwenden
  

Zusammenfassung: Code Besitzer selbst mit zuvor die InvariantCulture für String-Vergleich, Gehäuse und Sortierung sollte mit einem neuen Satz von String Ü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 dem StringComparison.Ordinal oder StringComparison.OrdinalIgnoreCase Mitglieder der neuen StringComparison Aufzählung angeben. Diese erzwingen einen Byte-für-Byte-Vergleich ähnlich wie strcmp, 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:

  1. Stellen Sie die Kultur ausdrücklich und führen Sie einen Groß- und Kleinschreibung vergleichen Unicode Äquivalenzregeln.
  2. Stellen Sie die Kultur in die unveränderliche Kultur und führen Sie Groß- und Kleinschreibung vergleichen Unicode Äquivalenzregeln.
  3. 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 ()?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top