it-swarm-eu.dev

Welche Methode ist im Allgemeinen am besten geeignet - StringComparison.OrdinalIgnoreCase oder StringComparison.InvariantCultureIgnoreCase?

Ich habe einen Code wie diesen:

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

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

141
Dave Haynes

Neuere .Net Docs verfügen jetzt über eine Tabelle, die Ihnen bei der Entscheidung hilft, welche für Ihre Situation am besten geeignet ist.

Von MSDN " Neue Empfehlungen für die Verwendung von Zeichenfolgen in Microsoft .NET 2. "

Zusammenfassung: Codebesitzer, die zuvor InvariantCulture für den Zeichenfolgenvergleich, die Groß- und Kleinschreibung und die Sortierung verwendet haben, sollten die Verwendung einer neuen Menge von String -Überladungen in Microsoft .NET 2.0 in Betracht ziehen. Speziell Daten, die kulturunabhängig und sprachlich irrelevant sind sollten Überladungen entweder mit dem StringComparison.Ordinal oder StringComparison.OrdinalIgnoreCase Mitglieder der neuen StringComparison Aufzählung. Diese erzwingen einen Byte-für-Byte-Vergleich ähnlich wie strcmp, der nicht nur Fehler bei der sprachlichen Interpretation von im Wesentlichen symbolischen Zeichenfolgen vermeidet, sondern auch eine bessere Leistung bietet.

156
Robert Taylor

Es hängt alles ab

Der Vergleich von Unicode-Zeichenfolgen ist schwierig:

Bei der Implementierung von Unicode-Zeichenfolgensuchen und Vergleichen in Textverarbeitungssoftware muss das Vorhandensein äquivalenter Codepunkte berücksichtigt werden. Ohne diese Funktion könnten Benutzer, die nach einer bestimmten Codepunktsequenz suchen, keine anderen visuell nicht unterscheidbaren Glyphen finden, die eine andere, aber kanonisch äquivalente Codepunktdarstellung aufweisen.

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


Wenn Sie versuchen, 2 Unicode-Zeichenfolgen unabhängig von der Groß- und Kleinschreibung zu vergleichen und möchten, dass sie überall funktionieren [~ # ~] [~ # ~] , Sie habe ein unmögliches Problem.

Das klassische Beispiel ist das türkische i , das in Großbuchstaben zu İ wird (beachten Sie den Punkt)

Standardmäßig verwendet das .Net-Framework normalerweise CurrentCulture für Funktionen, die sich auf Zeichenfolgen beziehen, mit einer sehr wichtigen Ausnahme von .Equals, das einen ordinalen (byteweisen) Vergleich verwendet.

Dies führt konstruktionsbedingt dazu, dass sich die verschiedenen Zeichenfolgenfunktionen je nach Computerkultur unterschiedlich verhalten.


Nichtsdestotrotz wollen wir manchmal einen "allgemeinen Zweck", bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, einen Vergleich.

Möglicherweise möchten Sie, dass sich Ihr 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. Legen Sie die Kultur explizit fest und führen Sie einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung mithilfe von Unicode-Äquivalenzregeln durch.
  2. Stellen Sie die Kultur auf Invariante Kultur ein und führen Sie einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung mithilfe von Unicode-Äquivalenzregeln durch.
  3. Verwenden Sie OrdinalIgnoreCase , um die Zeichenfolge mit InvariantCulture in Großbuchstaben zu schreiben, 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 einem Computerbildschirm auf die gleiche Weise gerendert werden, nicht als identisch angesehen werden. Beispielsweise: "\u0061\u030a" und "\u00e5" beide rendern å. Bei einem ordinalen Vergleich wird dies jedoch als anders angesehen.

Die Auswahl hängt stark von der Anwendung ab, die Sie erstellen.

  • Wenn ich eine Branchen-App schreiben würde, die nur von türkischen Benutzern verwendet wird, würde ich sicher Methode 1 verwenden.
  • Wenn ich nur einen einfachen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung benötigte, zum Beispiel einen Spaltennamen in einer Datenbank, der normalerweise Englisch ist, würde ich wahrscheinlich Methode 3 verwenden.

Microsoft hat ihre Reihe von Empfehlungen mit expliziten Richtlinien. Es ist jedoch sehr wichtig, den Begriff der Unicode-Äquivalenz zu verstehen, bevor Sie sich diesen Problemen nähern.

Denken Sie auch daran, dass OrdinalIgnoreCase ein sehr spezielle Art der Bestie ist, die ein bisschen ordinal auswählt und mit ein paar lexikografisch gemischten Aspekten vergleicht. Das kann verwirrend sein.

57
Sam Saffron

MSDN gibt hierzu einige ziemlich klare Empfehlungen ab: http://msdn.Microsoft.com/en-us/library/ms973919.aspx

8
chessguy

Ich denke, es hängt von Ihrer Situation ab. Da ordinale Vergleiche tatsächlich die numerischen Unicode-Werte der Zeichen betrachten, sind sie nicht die beste Wahl, wenn Sie alphabetisch sortieren. Für Zeichenfolgenvergleiche wäre die Ordnungszahl jedoch etwas schneller.

3
Bullines

Es hängt davon ab, was Sie wollen, obwohl ich mich vor einer invarianten Kultur scheuen würde, es sei denn, Sie möchten sehr sicher, dass Sie den Code niemals für andere Sprachen lokalisieren möchten. Verwenden Sie stattdessen CurrentCulture.

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

1
Joel Coehoorn

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

Siehe folgenden Link:

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

0
TheMoot