Was ist der Unterschied zwischen InvariantCulture und Ordinalvergleich, wenn zwei Zeichenfolgen in c # auf Gleichheit verglichen werden?
c#
.net
string-comparison
ordinal
Kapil
quelle
quelle
String1.Equals(String2, StringComparison.Ordinal)
, die es verwenden , ist es besser, es zu verwendenString1 == String2
, daString1.Equals(String2)
es sich um einen ordinalen Vergleich handelt, bei dem die Groß- und Kleinschreibung beachtet wird.==
"besser" macht, aber es ist a) kürzer, b) weniger explizit darüber, was genau es tut und c)String1
kann null sein, ohne dass der Vergleich a auslöstNullReferenceException
.StringComparison
Typ explizit angeben . Im Fall eines Zeichenfolgenvergleichs bedeutet diesString.Equals
.NullReferenceException
, können Sie einfach die statische Methode verwenden :String.Equals(string1, string2, StringComparison.Ordinal)
.Antworten:
InvariantCulture
Verwendet einen "Standard" -Satz von Zeichenreihenfolgen (a, b, c, ... usw.). Dies steht im Gegensatz zu einigen bestimmten Gebietsschemas, in denen Zeichen in unterschiedlicher Reihenfolge sortiert werden können ("a-mit-akut" kann je nach Gebietsschema vor oder nach "a" stehen usw.).
Ordinal
Betrachtet man dagegen nur die Werte der Rohbytes, die das Zeichen darstellen.
Unter http://msdn.microsoft.com/en-us/library/e6883c06.aspx finden Sie ein großartiges Beispiel , das die Ergebnisse der verschiedenen StringComparison-Werte zeigt. Am Ende zeigt es (Auszug):
Sie können sehen, wo InvariantCulture ergibt (U + 0069, U + 0049, U + 00131), Ordnungserträge (U + 0049, U + 0069, U + 00131).
quelle
Es ist zum Beispiel wichtig - es gibt eine Sache, die als Charaktererweiterung bezeichnet wird
Mit
InvariantCulture
dem ß wird das Zeichen auf ss erweitert.quelle
Ordinal
undInvariantCulture
? Darum geht es in der ursprünglichen Frage.ß
, sollte beachtet werden, dassß
zumindest auf Deutsch ein Doppel s entspricht. Quelle: en.wikipedia.org/wiki/%C3%9Fß
undss
austauschbar in Deutsch (ich bin ein Muttersprachler). Es gibt Fälle, in denen beide legal sind (aber oft ist eines veraltet / nicht empfohlen), und es gibt Fälle, in denen nur ein Formular zulässig ist.Verweisen auf bewährte Methoden für die Verwendung von Zeichenfolgen in .NET Framework :
StringComparison.Ordinal
oderStringComparison.OrdinalIgnoreCase
für Vergleiche als sicheren Standard für den kulturunabhängigen String-Abgleich.StringComparison.Ordinal
oderStringComparison.OrdinalIgnoreCase
für eine bessere Leistung.StringComparison.Ordinal
oderStringComparison.OrdinalIgnoreCase
Werte anstelle von Zeichenfolgenoperationen, je nachdem,CultureInfo.InvariantCulture
wann der Vergleich sprachlich irrelevant ist (z. B. symbolisch).Und schlussendlich:
StringComparison.InvariantCulture
in den meisten Fällen keine Zeichenfolgenoperationen basierend auf . Eine der wenigen Ausnahmen ist, wenn Sie sprachlich bedeutsame, aber kulturell agnostische Daten beibehalten.quelle
Ein weiterer praktischer Unterschied (auf Englisch, wo Akzente ungewöhnlich sind) besteht darin, dass bei einem InvariantCulture-Vergleich die gesamten Zeichenfolgen zuerst nach Groß- und Kleinschreibung verglichen werden und dann, falls erforderlich (und angefordert), nach Groß- und Kleinschreibung unterschieden wird, nachdem zuerst nur die einzelnen Buchstaben verglichen wurden. (Sie können natürlich auch einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung durchführen, bei dem nicht nach Groß- und Kleinschreibung unterschieden wird.) Korrigiert:Akzentuierte Buchstaben werden als eine andere Variante derselben Buchstaben betrachtet, und die Zeichenfolge wird verglichen, wobei zuerst Akzente ignoriert und dann berücksichtigt werden, wenn alle allgemeinen Buchstaben übereinstimmen (ähnlich wie bei unterschiedlichen Groß- und Kleinschreibung, außer dass sie bei einem Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung nicht letztendlich ignoriert werden). Diese Gruppe akzentuiert Versionen des ansonsten gleichen Wortes nahe beieinander, anstatt beim ersten Akzentunterschied vollständig getrennt zu sein. Dies ist die Sortierreihenfolge, die Sie normalerweise in einem Wörterbuch finden. Großgeschriebene Wörter werden direkt neben ihren Kleinbuchstaben angezeigt, und Buchstaben mit Akzent befinden sich in der Nähe des entsprechenden Buchstabens ohne Akzent.
Ein Ordnungsvergleich vergleicht streng die numerischen Zeichenwerte und endet bei der ersten Differenz. Dies sortiert großgeschriebene Buchstaben vollständig getrennt von den Kleinbuchstaben (und Akzentbuchstaben vermutlich getrennt von diesen), so dass großgeschriebene Wörter nicht annähernd ihre Kleinbuchstabenäquivalente sortieren würden.
InvariantCulture betrachtet Großbuchstaben auch als größer als Kleinbuchstaben, während Ordinal Großbuchstaben als kleiner als Kleinbuchstaben betrachtet (ein Überbleibsel von ASCII aus den alten Tagen, bevor Computer Kleinbuchstaben hatten, wurden die Großbuchstaben zuerst zugewiesen und hatten daher niedrigere Werte als die Kleinbuchstaben später hinzugefügt).
Zum Beispiel durch Ordinal:
"0" < "9" < "A" < "Ab" < "Z" < "a" < "aB" < "ab" < "z" < "Á" < "Áb" < "á" < "áb"
Und von InvariantCulture:
"0" < "9" < "a" < "A" < "á" < "Á" < "ab" < "aB" < "Ab" < "áb" < "Áb" < "z" < "Z"
quelle
Obwohl es sich um eine Frage der Gleichheit handelt , wird hier zur schnellen visuellen Bezugnahme die Reihenfolge einiger Zeichenfolgen anhand einiger Kulturen sortiert , um einige der Besonderheiten zu veranschaulichen.
Beobachtungen:
de-DE
,ja-JP
Unden-US
sortieren die gleiche Art und WeiseInvariant
nur sortiertss
undß
anders als die oben genannten drei Kulturenda-DK
sortiert ganz andersIgnoreCase
Flagge ist für alle untersuchten Kulturen von BedeutungDer zum Generieren der obigen Tabelle verwendete Code:
quelle
CultureComparer
die wir verwenden könnten Für diese TabelleDanish
erwies sich die Kultur (Info) als sehr wichtig.)Invariante ist eine sprachlich angemessene Art des Vergleichs.
Ordnungszahl ist ein binärer Vergleichstyp. (schneller)
Siehe http://www.siao2.com/2004/12/29/344136.aspx
quelle
Hier ist ein Beispiel, bei dem der Vergleich der Zeichenfolgengleichheit mit InvariantCultureIgnoreCase und OrdinalIgnoreCase nicht zu denselben Ergebnissen führt:
Wenn Sie dies ausführen, ist equals1 falsch und equals2 ist true.
quelle
a="\x00e9"
(e akut) undb="\x0065\x0301"
(e kombiniert mit einem akuten Akzent)StringComparer.Ordinal.Equals(a, b)
false zurückgeben, währendStringComparer.InvariantCulture.Equals(a, b)
true zurückgegeben wird.Sie müssen keine ausgefallenen Unicode-Zeichenbeispiele verwenden, um den Unterschied zu zeigen. Hier ist ein einfaches Beispiel, das ich heute herausgefunden habe und das überraschend ist und nur aus ASCII-Zeichen besteht.
Gemäß der ASCII-Tabelle ist
0
(0x48) im_
normalen Vergleich kleiner als (0x95). InvariantCulture würde das Gegenteil sagen (PowerShell-Code unten):quelle
Versuchen Sie immer, InvariantCulture in den Zeichenfolgenmethoden zu verwenden, die dies als Überladung akzeptieren. Mit InvariantCulture sind Sie auf der sicheren Seite. Viele .NET-Programmierer verwenden diese Funktionalität möglicherweise nicht. Wenn Ihre Software jedoch von verschiedenen Kulturen verwendet wird, ist InvariantCulture eine äußerst praktische Funktion.
quelle