string.ToLower () und string.ToLowerInvariant ()

163

Was ist der Unterschied und wann was zu verwenden? Was ist das Risiko, wenn ich immer benutze ToLower()und was ist das Risiko, wenn ich immer benutze ToLowerInvariant()?

Louis Rhys
quelle
4
Vielleicht sollten Sie stattdessen Zeichenfolgen in Großbuchstaben normalisieren. Siehe msdn.microsoft.com/en-us/library/bb386042.aspx
habakuk

Antworten:

148

Abhängig von der aktuellen Kultur erstellt ToLower möglicherweise einen kulturspezifischen Kleinbuchstaben, den Sie nicht erwarten. ınfoZum Beispiel ohne den Punkt auf dem i zu produzieren infound damit String-Vergleiche durcheinander zu bringen. Aus diesem Grund sollte ToLowerInvariant für nicht sprachspezifische Daten verwendet werden. Wenn Sie möglicherweise Benutzereingaben in ihrer Muttersprache / ihrem Zeichensatz haben, ist dies im Allgemeinen das einzige Mal, dass Sie ToLower verwenden.

In dieser Frage finden Sie ein Beispiel für dieses Problem: C # - ToLower () entfernt manchmal Punkte aus dem Buchstaben "I".

AaronLS
quelle
45

Ich denke, das kann nützlich sein:

http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx

aktualisieren

Wenn Ihre Anwendung davon abhängt, dass sich eine Zeichenfolge auf vorhersehbare Weise ändert und von der aktuellen Kultur nicht beeinflusst wird, verwenden Sie die ToLowerInvariant-Methode. Die ToLowerInvariant-Methode entspricht ToLower (CultureInfo.InvariantCulture). Die Methode wird empfohlen, wenn eine Sammlung von Zeichenfolgen in einer vorhersagbaren Reihenfolge in einem Steuerelement der Benutzeroberfläche angezeigt werden muss.

ebenfalls

... ToLower ist ToLowerInvariant an den meisten Orten sehr ähnlich. Die Dokumente zeigen, dass diese Methoden nur das Verhalten der türkischen Kulturen verändern werden. Auf Windows-Systemen unterscheidet das Dateisystem nicht zwischen Groß- und Kleinschreibung, wodurch die Verwendung weiter eingeschränkt wird ...

http://www.dotnetperls.com/tolowerinvariant-toupperinvariant

hth

Danyolgiax
quelle
@danyolgiax Bitte können Sie weiter ausführen? Ich kann seine Benutzerfreundlichkeit nicht aus dem Link von msdn ableiten. Danke
Prerak K
2
ja ToLowerInvariant funktioniert nicht wie erwartet auf Türkisch. İ wird ı
MonsterMMORPG
28

String.ToLower()verwendet die Standardkultur, während String.ToLowerInvariant()die invariante Kultur verwendet wird. Sie fragen also im Wesentlichen nach den Unterschieden zwischen der invarianten Kultur und dem Vergleich der Ordnungszahlen .

Cheng Chen
quelle
Nein, ist er nicht. "Ordinal" ist eine dritte Option - eine etwas andere Art, die aktuelle Kultur zu "ignorieren". Die Unterscheidung ist für die Erörterung von ToLowerVarianten nicht relevant . Ordinal vs. Invariant ändert nur die "Sortierreihenfolge" von zwei Zeichenfolgen, ändert aber nicht den Gleichheitsvergleich.
ToolmakerSteve
27

TL; DR:

Bei der Arbeit mit "Inhalten" (zB Artikel, Beiträge, Kommentare, Namen, Orte usw.) verwenden ToLower(). Wenn Sie mit "Literalen" arbeiten (z. B. Befehlszeilenargumente, benutzerdefinierte Grammatiken, Zeichenfolgen, die Aufzählungen sein sollten usw.), verwenden Sie ToLowerInvariant().

Beispiele:

= Verwendung ToLowerInvariantfalsch =

Bedeutet auf Türkisch DIŞ"draußen" und diş"Zahn". Das richtige untere Gehäuse DIŞist dış. Wenn Sie also ToLowerInvariantfalsch verwenden, können Tippfehler in der Türkei auftreten.

= Verwendung ToLowerfalsch =

Stellen Sie sich nun vor, Sie schreiben einen SQL-Parser. Irgendwo haben Sie Code, der aussieht wie:

if(operator.ToLower() == "like")
{
  // Handle an SQL LIKE operator
}

Die SQL-Grammatik ändert sich nicht, wenn Sie die Kulturen ändern. Ein Franzose schreibt nicht SÉLECTIONNEZ x DE booksstatt SELECT X FROM books. Damit der obige Code funktioniert, muss eine türkische Person schreiben SELECT x FROM books WHERE Author LİKE '%Adams%'(beachten Sie den Punkt über dem Großbuchstaben i, der fast unmöglich zu sehen ist). Dies wäre für Ihren türkischen Benutzer ziemlich frustrierend.

Tempo
quelle