Ich habe einen Code wie diesen:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Der Fall ist mir egal. Soll ich OrdinalIgnoreCase
, InvariantCultureIgnoreCase
oder CurrentCultureIgnoreCase
?
Ich habe einen Code wie diesen:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Der Fall ist mir egal. Soll ich OrdinalIgnoreCase
, InvariantCultureIgnoreCase
oder CurrentCultureIgnoreCase
?
Antworten:
Aus MSDNs " Neue Empfehlungen für die Verwendung von Zeichenfolgen in Microsoft .NET 2.0 "
Zusammenfassung: Codebesitzer, die zuvor die
InvariantCulture
Option zum Vergleichen, Umschließen und Sortieren von Zeichenfolgen verwenden, sollten die Verwendung neuerString
Überladungen in Microsoft .NET 2.0 in Betracht ziehen . Insbesondere sollten Daten, die kulturunabhängig und sprachlich irrelevant sind, Überladungen angeben, indem sie entweder dieStringComparison.Ordinal
oder dieStringComparison.OrdinalIgnoreCase
Mitglieder der neuenStringComparison
Aufzählung verwenden. Diese erzwingen einen ähnlichen Byte-für-Byte-Vergleichstrcmp
, der nicht nur Fehler bei der sprachlichen Interpretation von im Wesentlichen symbolischen Zeichenfolgen vermeidet, sondern auch eine bessere Leistung bietet.
"Straße"
und "STRASSE"
. Bei der Verwendung OrdinalIgnoreCase
der Equals
Retouren false
, während InvariantCultureIgnoreCase
sagt , dass sie gleich sind.
Der Vergleich von Unicode-Zeichenfolgen ist schwierig:
Bei der Implementierung von Unicode-Zeichenfolgensuchen und -vergleichen in Textverarbeitungssoftware müssen gleichwertige 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 ohne Berücksichtigung der Groß- und Kleinschreibung zu vergleichen und möchten, dass sie ÜBERALL funktionieren , haben Sie 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 die CurrentCulture für Zeichenfolgenfunktionen, mit einer sehr wichtigen Ausnahme .Equals
, bei der ein Ordnungsvergleich (Byte für Byte) verwendet wird.
Dies führt konstruktionsbedingt dazu, dass sich die verschiedenen Zeichenfolgenfunktionen je nach Computerkultur unterschiedlich verhalten.
Trotzdem wollen wir manchmal einen "allgemeinen Zweck", bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird.
Beispielsweise möchten Sie möglicherweise, dass sich Ihr Zeichenfolgenvergleich unabhängig vom Computer, auf dem Ihre Anwendung installiert ist, genauso verhält.
Um dies zu erreichen, haben wir 3 Möglichkeiten:
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 durchgeführt wird, bedeutet, dass einige Zeichenfolgen, die auf einem Computerbildschirm auf dieselbe Weise gerendert werden, nicht als identisch angesehen werden. Zum Beispiel: "\u0061\u030a"
und "\u00e5"
beide rendern å. Bei einem Ordnungsvergleich wird dies jedoch als unterschiedlich angesehen.
Welche Sie stark auswählen, hängt von der Anwendung ab, die Sie erstellen.
Microsoft hat seine Empfehlungen mit expliziten Richtlinien. Es ist jedoch sehr wichtig, den Begriff der Unicode-Äquivalenz zu verstehen, bevor diese Probleme angegangen werden.
Denken Sie auch daran, dass OrdinalIgnoreCase eine ganz besondere Art von Bestie ist, bei der ein bisschen Ordnungszahl ausgewählt und ausgewählt wird, verglichen mit einigen lexikografischen Aspekten. Dies kann verwirrend sein.
Ich denke, es hängt von Ihrer Situation ab. Da bei Ordnungsvergleichen tatsächlich die numerischen Unicode-Werte der Zeichen berücksichtigt werden, sind sie nicht die beste Wahl, wenn Sie alphabetisch sortieren. Für Zeichenfolgenvergleiche wäre die Ordnungszahl jedoch etwas schneller.
Es hängt davon ab, was Sie wollen, obwohl ich mich vor invarianter Kultur scheuen würde, es sei denn, Sie sind sich sehr sicher, dass Sie den Code für andere Sprachen niemals lokalisieren möchten. Verwenden Sie stattdessen CurrentCulture.
Außerdem sollte OrdinalIgnoreCase Zahlen berücksichtigen, die möglicherweise Ihren Wünschen entsprechen oder nicht.
Die sehr einfache Antwort lautet: Wenn Sie kein Türkisch verwenden, müssen Sie InvariantCulture nicht verwenden.
Siehe folgenden Link:
Was ist in C # der Unterschied zwischen ToUpper () und ToUpperInvariant ()?