Ich habe eine DetailsView
mit einem , TextBox
und ich möchte , dass die Eingangsdaten werden immer gespeichert mit dem ersten Buchstaben CAPITAL.
Beispiel:
"red" --> "Red"
"red house" --> " Red house"
Wie kann ich diese maximale Leistung erreichen ?
HINWEIS :
Basierend auf den Antworten und den Kommentaren unter den Antworten denken viele Leute, dass hier nach der Großschreibung aller Wörter in der Zeichenfolge gefragt wird . ZB => Red House
ist es nicht, aber wenn Sie danach suchen , suchen Sie nach einer der Antworten, die TextInfo
die ToTitleCase
Methode von verwenden. (HINWEIS: Diese Antworten sind für die tatsächlich gestellte Frage falsch .) Informationen finden
Sie im TextInfo.ToTitleCase-Dokument (berührt keine Wörter mit Großbuchstaben - sie werden als Akronyme betrachtet; möglicherweise werden Kleinbuchstaben in der Mitte von Wörtern verwendet, die "nicht" sein sollten gesenkt, zB "McDonald" => "Mcdonald"; es wird nicht garantiert, dass alle kulturspezifischen Feinheiten bezüglich der Kapitalisierungsregeln behandelt werden.)
HINWEIS :
Die Frage ist nicht eindeutig , ob Buchstaben nach dem ersten werden sollten gezwungen zu Fall zu senken . Bei der akzeptierten Antwort wird davon ausgegangen, dass nur der erste Buchstabe geändert werden sollte . Wenn Sie alle Buchstaben in der Zeichenfolge außer dem ersten in Kleinbuchstaben erzwingen möchten , suchen Sie nach einer Antwort mitToLower
, die ToTitleCase und nicht enthält .
quelle
Antworten:
Auf C # 8 aktualisiert
C # 7
Wirklich alte Antworten
EDIT : Diese Version ist kürzer. Für eine schnellere Lösung werfen Sie einen Blick auf die Antwort von Equiso
EDIT 2 : Die wahrscheinlich schnellste Lösung ist die von Darren (es gibt sogar einen Benchmark), obwohl ich die
string.IsNullOrEmpty(s)
Validierung ändern würde, um eine Ausnahme auszulösen, da die ursprüngliche Anforderung erwartet, dass ein erster Buchstabe vorhanden ist, damit er in Großbuchstaben geschrieben werden kann. Beachten Sie, dass dieser Code für eine generische Zeichenfolge funktioniert und nicht speziell für gültige Werte aus demTextbox
.quelle
String.Join
ein Trennzeichen ist, mit dem Zeichenfolgen verbunden werden sollen, die mit dem zweiten Parameter angegeben wurden.var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr);
würde aber wahrscheinlich an Geschwindigkeit gewinnen, da Sie weniger unveränderliche Objekte erstellen (und insbesondere die überspringenString.Join
). Dies hängt natürlich von der Länge der Zeichenfolge ab."Argh!"
mit der halten Versalien ersten Briefes Regel. ;)Alte Antwort: Dies macht jeden ersten Buchstaben in Großbuchstaben
quelle
Der richtige Weg ist, Kultur zu nutzen:
Hinweis: Dadurch wird jedes Wort in einer Zeichenfolge groß geschrieben, z. B. "Rotes Haus" -> "Rotes Haus". Die Lösung wird auch Großbuchstaben in Worten verwenden, z. B. "alter McDonald" -> "alter Mcdonald".
quelle
ToLower
ist dies ein Fehler, da dadurch die Großschreibung mitten im Wort gelöscht wird, z. B. "McDonalds". 3) Bei der Frage geht es darum , nur das erste Wort der Zeichenfolge zu ändern , nicht um TitleCase.Ich habe die schnellste Methode von http://www.dotnetperls.com/uppercase-first-letter übernommen und in die Erweiterungsmethode konvertiert:
ANMERKUNG: Der Grund für die Verwendung
ToCharArray
ist schneller als die Alternativechar.ToUpper(s[0]) + s.Substring(1)
, da nur eine Zeichenfolge zugewiesen wird, während derSubstring
Ansatz eine Zeichenfolge für die Teilzeichenfolge und dann eine zweite Zeichenfolge zum Erstellen des Endergebnisses zuweist.EDIT : So sieht dieser Ansatz aus, kombiniert mit dem ersten Test von Carlos Muñoz akzeptierte Antwort :
quelle
return string.Empty
hier einen "schlechten" Aufruf der Methode verbergen würde.Sie können die "ToTitleCase-Methode" verwenden.
Diese Erweiterungsmethode löst jedes Titelfallproblem.
einfach zu bedienen
die Erweiterungsmethode
quelle
FirstLetterToUpper
in Equisos Antwort (oder in Guillernets neuerer Antwort) undToTitleCase
hier, jedoch ohne den zweiten Parameter. Dann brauche ich nichtenum TitleCase
.Für den ersten Buchstaben mit Fehlerprüfung:
Und hier ist das gleiche wie eine praktische Erweiterung
quelle
quelle
Wenn die Leistung / Speichernutzung ein Problem darstellt, erstellt dieser nur einen (1) StringBuilder und einen (1) neuen String mit der gleichen Größe wie der Original-String.
quelle
char[]
statt mit der gesamten Infrastruktur einesStringBuilder
Wraps geschehen . Anstattnew StringBuilder(str)
, Verwendungstr.ToCharArray()
, und stattsb.ToString()
, Verwendungnew string(charArray)
.StringBuilder
emuliert die Art der Indizierung, die ein Zeichenarray nativ verfügbar macht, sodass die tatsächliche.ToUpper
Zeile im Wesentlichen dieselbe sein kann. :-)ToCharArray
, wie @JonathanGilbert vorgeschlagenSchnellste Methode.
Tests zeigen die nächsten Ergebnisse (Zeichenfolge mit 10000000 Symbolen als Eingabe): Testergebnisse
quelle
s
Parameter zurückzugeben, wenn sie null oder leer sind.Versuche dies:
quelle
Wenn Sie sich nur dafür interessieren, dass der erste Buchstabe groß geschrieben wird und der Rest der Zeichenfolge keine Rolle spielt, können Sie einfach das erste Zeichen auswählen, es in Großbuchstaben schreiben und es mit dem Rest der Zeichenfolge ohne das ursprüngliche erste Zeichen verketten.
Wir müssen das erste Zeichen ToString () konvertieren, da wir es als Char-Array lesen und der Char-Typ keine ToUpper () -Methode hat.
quelle
Hier ist eine Möglichkeit, dies als Erweiterungsmethode zu tun:
Kann dann wie folgt aufgerufen werden:
Und hier sind einige Unit-Tests dafür:
quelle
string.Format
ist übertrieben; einfach tuntext.Substring(0, 1).ToUpper() + text.Substring(1)
.Da ich zufällig auch daran gearbeitet habe und mich nach Ideen umgesehen habe, ist dies die Lösung, zu der ich gekommen bin. Es verwendet LINQ und kann den ersten Buchstaben einer Zeichenfolge groß schreiben, auch wenn das erste Vorkommen kein Buchstabe ist. Hier ist die Erweiterungsmethode, die ich am Ende gemacht habe.
Ich bin sicher, es gibt eine Möglichkeit, dies ein wenig zu optimieren oder zu bereinigen.
quelle
Ich habe hier etwas gefunden http://www.dotnetperls.com/uppercase-first-letter :
vielleicht hilft das!!
quelle
Überprüfen Sie, ob die Zeichenfolge nicht null ist, und konvertieren Sie das erste Zeichen in Großbuchstaben und den Rest in Kleinbuchstaben:
quelle
Dies wird es tun, obwohl es auch sicherstellen wird, dass es keine fehlerhaften Großbuchstaben gibt, die nicht am Anfang des Wortes stehen.
quelle
s
Nullprüfung vor dem Aufruf von ToTitleCase.Hier scheint es viel Komplexität zu geben, wenn Sie nur Folgendes benötigen:
Bemerkenswerte Punkte:
Es ist eine Erweiterungsmethode.
Wenn die Eingabe null, leer oder Leerzeichen ist, wird die Eingabe unverändert zurückgegeben.
String.IsNullOrWhiteSpace wurde mit .NET Framework 4 eingeführt. Dies funktioniert nicht mit älteren Frameworks.
quelle
IsNullOrWhiteSpace
anstelle vonIsNullOrEmpty
ist, wenn Sie die ersten Nicht- Antworten finden und ändern. Leerraum . Aber Sie tun es nicht - Sie operieren immer weiters[0]
. Es ist also sinnlos [sowohl semantisch als auch leistungsmäßig] zu verwendenIsNullOrWhiteSpace
.IsNullOrWhiteSpace
mich diese Verwendung von beunruhigt, ist, dass ein unvorsichtiger Leser denken könnte: "Er hat nach Leerzeichen gesucht, sodass der folgende Code einen Buchstaben wirklich findet und ändert, selbst wenn ihm Leerzeichen vorangestellt sind." Da Ihr Code einen "ersten" Buchstaben mit Leerzeichen nicht ändernIsNullOrWhiteSpace
kann , kann die Verwendung nur einen Leser irreführen .quelle
String
Dies kann alles sein, wasUpper
oderLower
.so ist es eine generische Lösung für alle Zeichenfolgen.Join
stattemp.First().ToString().ToUpper() + emp.Substring(1);
? Müssen wahrscheinlich auch defensiver sein :output = string.IsNullOrEmpty(emp) ? string.Empty : [...]
. Außerdem, fwiw, stimme @ CarlosMuñoz zu - du brauchst das nichtToLower()
für die Frage des OP.Substring
ist auch ein guter Schreibstil für Code. Ich stimme Ihrer Lösung zum Trimmen eines Codes zu, aber in diesem Fall ist das Schreiben von a eineToLower()
gute Programmierpraxis.string
kann alles seinUpper
Falls oderLower
Fall von Benutzereingaben abhängt, gebe ich eine generische Lösung.Ich wollte eine "MAXIMALE LEISTUNG" -Antwort geben. In meinen Augen erfasst eine Antwort mit "MAXIMAL PERFORMANCE" alle Szenarien und liefert die Antwort auf die Frage, die diese Szenarien berücksichtigt. Also, hier ist meine Antwort. Mit diesen Gründen:
Wenn Sie sie als optionale Parameter angeben, kann diese Methode vollständig wiederverwendet werden, ohne jedes Mal die ausgewählte Kultur eingeben zu müssen.
quelle
Kürzlich hatte ich eine ähnliche Anforderung und erinnerte mich, dass die LINQ-Funktion Select () einen Index bereitstellt:
Da ich das sehr oft brauche, habe ich eine Erweiterungsmethode für den String-Typ erstellt:
Bitte beachten Sie, dass nur der erste Buchstabe in Großbuchstaben umgewandelt wird - alle verbleibenden Zeichen werden nicht berührt. Wenn die anderen Zeichen in Kleinbuchstaben geschrieben werden müssen, können Sie auch Char.ToLower (currentChar) für Index> 0 oder ToLower () für die gesamte Zeichenfolge aufrufen.
In Bezug auf die Leistung habe ich den Code mit der Lösung von Darren verglichen. Auf meinem Computer ist Darrens Code ungefähr zweimal schneller, was keine Überraschung ist, da er nur den ersten Buchstaben innerhalb eines char-Arrays direkt bearbeitet. Ich schlage vor, Sie nehmen Darrens Code, wenn Sie die schnellste verfügbare Lösung benötigen. Wenn Sie auch andere Zeichenfolgenmanipulationen integrieren möchten, kann es praktisch sein, die Ausdruckskraft einer Lambda-Funktion zu haben, die die Zeichen der Eingabezeichenfolge berührt - Sie können diese Funktion leicht erweitern -, daher lasse ich diese Lösung hier.
quelle
Ich denke, die folgende Methode ist die beste Lösung
ref
quelle
Da es bei dieser Frage um die Maximierung der Leistung geht, habe ich Darrens Version für die Verwendung von
Span
s übernommen, wodurch der Müll reduziert und die Geschwindigkeit um etwa 10% verbessert wird.Performance
Vollständiger Testcode
Bearbeiten: Es gab einen Tippfehler anstelle von s [0], war ein [0] - dies führt dazu, dass der leere Wert a auf den zugewiesenen Bereich a übertragen wird.
quelle
Dadurch wird dieser erste Buchstabe und jeder Buchstabe nach einem Leerzeichen großgeschrieben und jeder andere Buchstabe in Kleinbuchstaben geschrieben.
quelle
Verwenden Sie den folgenden Code:
quelle
Es scheint, als würde keine der hier angegebenen Lösungen einen Leerraum vor der Zeichenfolge behandeln.
Fügen Sie dies nur als Gedanken hinzu:
Es sollte behandelt werden
this won't work on other answers
(dieser Satz hat am Anfang ein Leerzeichen), und wenn Sie das Leerzeichen-Trimmen nicht mögen, übergeben Sie einfach einenfalse
als zweiten Parameter (oder ändern Sie die Standardeinstellung infalse
und übergebentrue
Sie, wenn Sie mit Leerzeichen umgehen möchten).quelle
FluentSharp hat die
lowerCaseFirstLetter
Methode, die dies tuthttps://github.com/o2platform/FluentSharp/blob/700dc35759db8e2164771a71f73a801aa9379074/FluentSharp.CoreLib/ExtensionMethods/System/String_ExtensionMethods.cs#L575
quelle
Der einfachste Weg, den ersten Brief zu kapitalisieren, ist:
1- Verwenden von Sytem.Globalization;
`
quelle
Die folgende Funktion ist in jeder Hinsicht korrekt:
Das habe ich hier gefunden
quelle
char.IsWhiteSpace( array[ i -1 ] )
stattdessen anstelle von.. == ' '
, um alle Leerzeichen zu verarbeiten. 2) Entfernen Sie die beiden Stellen, die dies tunif (char.isLower(..))
- sie haben keinen Zweck.ToUpper
tut einfach nichts, wenn ein Zeichen nicht in Kleinbuchstaben geschrieben ist.Wenn Sie die obige Frage von Carlos erweitern und mehrere Sätze groß schreiben möchten, können Sie diesen Code verwenden:
quelle
Mögliche Lösung zur Lösung Ihres Problems.
quelle