J'ai un DetailsView
avec un TextBox
et je veux que les données d'entrée soient toujours enregistrées avec la PREMIÈRE LETTRE EN MAJUSCULE.
Exemple:
"red" --> "Red"
"red house" --> " Red house"
Comment puis-je atteindre ces performances maximales ?
REMARQUE :
Sur la base des réponses et des commentaires sous les réponses, de nombreuses personnes pensent que cela demande de mettre en majuscule tous les mots de la chaîne. Par exemple, => Red House
ce n'est pas le cas, mais si c'est ce que vous cherchez , recherchez l'une des réponses qui utilise TextInfo
la ToTitleCase
méthode de. (REMARQUE: ces réponses sont incorrectes pour la question réellement posée.)
Voir le document TextInfo.ToTitleCase pour les mises en garde (ne touche pas les mots en majuscules - ils sont considérés comme des acronymes; peut minuscules au milieu des mots qui "ne devraient pas" être abaissé, par exemple "McDonald" => "Mcdonald"; il n'est pas garanti de gérer toutes les subtilités propres à la culture concernant les règles de capitalisation.)
REMARQUE :
la question est ambiguë de savoir si les lettres après la première doivent être forcées en minuscules . La réponse acceptée suppose que seule la première lettre doit être modifiée . Si vous souhaitez forcer toutes les lettres de la chaîne, sauf la première à être en minuscules, recherchez une réponse contenant ToLower
et ne contenant pas ToTitleCase .
la source
Réponses:
Mis à jour en C # 8
C # 7
Vraiment vieilles réponses
EDIT : Cette version est plus courte. Pour une solution plus rapide, jetez un œil à la réponse d'Equiso
EDIT 2 : La solution la plus rapide est probablement celle de Darren (il y a même un point de référence) bien que je changerais sa
string.IsNullOrEmpty(s)
validation pour lever une exception puisque l'exigence d'origine s'attend à ce qu'une première lettre existe afin qu'elle puisse être mise en majuscule. Notez que ce code fonctionne pour une chaîne générique et pas particulièrement sur les valeurs valides duTextbox
.la source
String.Join
est le séparateur avec lequel joindre les chaînes données avec le deuxième paramètre.var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr);
gagnerait probablement un peu de vitesse puisque vous créez des objets moins immuables (et surtout vous sautez leString.Join
). Cela dépend bien sûr de la longueur de la chaîne."Argh!"
conformément à la règle de la première lettre majuscule. ;)Ancienne réponse: chaque première lettre est en majuscule
la source
La bonne façon est d'utiliser Culture:
Remarque: Cela mettra en majuscule chaque mot dans une chaîne, par exemple "maison rouge" -> "maison rouge". La solution réduira également les majuscules en lettres minuscules, par exemple «vieux McDonald» -> «Old Mcdonald».
la source
ToLower
c'est une erreur, car elle efface la capitalisation au milieu du mot, par exemple "McDonalds". 3) La question est de ne changer que le premier mot de la chaîne , pas de TitleCase.J'ai pris la méthode la plus rapide de http://www.dotnetperls.com/uppercase-first-letter et converti en méthode d'extension:
REMARQUE: la raison pour laquelle l'utilisation
ToCharArray
est plus rapide que l'alternativechar.ToUpper(s[0]) + s.Substring(1)
est qu'une seule chaîne est allouée, tandis que l'Substring
approche alloue une chaîne pour la sous-chaîne, puis une deuxième chaîne pour composer le résultat final.EDIT : Voici à quoi ressemble cette approche, combinée avec le test initial de la réponse acceptée de CarlosMuñoz :
la source
return string.Empty
ici cacherait un "mauvais" appel à la méthode.Vous pouvez utiliser la "méthode ToTitleCase"
cette méthode d'extension résout tous les problèmes de casse.
facile à utiliser
la méthode d'extension
la source
FirstLetterToUpper
dans la réponse d'Equiso (ou dans la réponse plus récente de Guillernet), etToTitleCase
ici, mais sans le deuxième paramètre. Alors pas besoinenum TitleCase
.Pour la première lettre, avec vérification d'erreur:
Et voici la même chose qu'une extension pratique
la source
la source
Si les performances / l'utilisation de la mémoire sont un problème, celui-ci ne crée qu'un (1) StringBuilder et une (1) nouvelle chaîne de la même taille que la chaîne d'origine.
la source
char[]
plutôt que d'avoir toute l'infrastructure d'unStringBuilder
enveloppement. Au lieu denew StringBuilder(str)
, utilisezstr.ToCharArray()
et au lieu desb.ToString()
, utiliseznew string(charArray)
.StringBuilder
émule le type d'indexation qu'un tableau de caractères expose nativement, de sorte que la.ToUpper
ligne réelle peut être essentiellement la même. :-)ToCharArray
, comme suggéré par @JonathanGilbertMéthode la plus rapide.
Les tests montrent les résultats suivants (chaîne avec 10000000 symboles en entrée): Résultats des tests
la source
s
paramètre lorsqu'il est nul ou vide.Essaye ça:
la source
Si vous ne vous souciez que de la première lettre en majuscule et que le reste de la chaîne importe peu, vous pouvez simplement sélectionner le premier caractère, le mettre en majuscule et le concaténer avec le reste de la chaîne sans le premier caractère d'origine.
Nous devons convertir le premier caractère ToString () car nous le lisons en tant que tableau Char, et le type Char n'a pas de méthode ToUpper ().
la source
Voici un moyen de le faire comme méthode d'extension:
Peut alors être appelé comme:
Et voici quelques tests unitaires pour cela:
la source
string.Format
est exagéré; faites simplementtext.Substring(0, 1).ToUpper() + text.Substring(1)
.Comme il m'arrivait de travailler là-dessus également et que je cherchais des idées, c'est la solution à laquelle je suis parvenu. Il utilise LINQ et pourra mettre en majuscule la première lettre d'une chaîne, même si la première occurrence n'est pas une lettre. Voici la méthode d'extension que j'ai fini par faire.
Je suis sûr qu'il existe un moyen d'optimiser ou de nettoyer un peu cela.
la source
J'ai trouvé quelque chose ici http://www.dotnetperls.com/uppercase-first-letter :
peut-être que cela aide !!
la source
Vérifiez si la chaîne n'est pas nulle, puis convertissez le premier caractère en majuscules et le reste en minuscules:
la source
Cela le fera bien qu'il s'assurera également qu'il n'y a pas de majuscules errantes qui ne sont pas au début du mot.
la source
s
avant l'appel à ToTitleCase.Il semble y avoir beaucoup de complexité ici quand tout ce dont vous avez besoin est:
Points remarquables:
C'est une méthode d'extension.
Si l'entrée est nulle, vide ou en blanc, l'entrée est renvoyée telle quelle.
String.IsNullOrWhiteSpace a été introduit avec .NET Framework 4. Cela ne fonctionnera pas avec les anciens frameworks.
la source
IsNullOrWhiteSpace
plutôt queIsNullOrEmpty
, c'est si vous allez trouver et modifier le premier non espace blanc . Mais vous ne le faites pas - vous opérez toujourss[0]
. Donc, c'est inutile [à la fois sémantiquement et performance] à utiliserIsNullOrWhiteSpace
.IsNullOrWhiteSpace
me dérange, c'est qu'un lecteur imprudent pourrait penser "Il a vérifié les espaces blancs, donc le code suivant trouve et modifie vraiment une lettre, même si elle est précédée d'un espace blanc". Étant donné que votre code ne parviendra pas à modifier une "première" lettre précédée d'un espace blanc, l'utilisationIsNullOrWhiteSpace
ne peut qu'induire le lecteur en erreur .la source
String
is peut être n'importe quoi sonUpper
ouLower
.so c'est une solution générique pour toutes les chaînes.Join
au lieu deemp.First().ToString().ToUpper() + emp.Substring(1);
? Probablement besoin d'être plus défensive aussi:output = string.IsNullOrEmpty(emp) ? string.Empty : [...]
. Aussi, fwiw, d'accord avec @ CarlosMuñoz - vous n'avez pas besoin duToLower()
pour la question du PO.Substring
est également un bon style d'écriture de code, je suis d'accord avec votre solution pour couper un code, mais dans ce cas, écrire unToLower()
est une bonne pratique de programmation.string
peut être n'importe quoi Dans leUpper
cas ou leLower
cas dépend de l'entrée de l'utilisateur, je donne une solution générique.Je voulais apporter une réponse "PERFORMANCE MAXIMALE". Dans mon esprit, une réponse "PERFORMANCE MAXIMALE" capture tous les scénarios et fournit la réponse à la question expliquant ces scénarios. Alors, voici ma réponse. Pour ces raisons:
Les fournir en tant que paramètres facultatifs rend cette méthode totalement réutilisable, sans avoir à taper à chaque fois la culture choisie.
la source
Récemment, j'avais une exigence similaire et je me suis souvenu que la fonction LINQ Select () fournit un index:
Comme j'en ai besoin très souvent, j'ai créé une méthode d'extension pour le type de chaîne:
Veuillez noter que seule la première lettre est convertie en majuscules - tous les caractères restants ne sont pas touchés. Si vous avez besoin que les autres caractères soient en minuscules, vous pouvez également appeler Char.ToLower (currentChar) pour index> 0 ou appeler ToLower () sur la chaîne entière en premier lieu.
En ce qui concerne les performances, j'ai comparé le code avec la solution de Darren. Sur ma machine, le code de Darren est environ 2 fois plus rapide, ce qui n'est pas surprenant puisqu'il n'édite directement que la première lettre d'un tableau de caractères. Je vous suggère donc de prendre le code de Darren si vous avez besoin de la solution la plus rapide disponible. Si vous souhaitez également intégrer d'autres manipulations de chaînes, il peut être pratique d'avoir la puissance expressive d'une fonction lambda touchant les caractères de la chaîne d'entrée - vous pouvez facilement étendre cette fonction - alors je laisse cette solution ici.
la source
Je pense que la méthode ci-dessous est la meilleure solution
ref
la source
Comme cette question concerne la maximisation des performances, j'ai adopté la version de Darren pour utiliser
Span
s, ce qui réduit les déchets et améliore la vitesse d'environ 10%.Performance
Code de test complet
Edit: il y avait un typeo, au lieu de s [0], il y avait un [0] - cela donne la même valeur vide à la plage allouée a.
la source
Cela met en majuscule cette première lettre et chaque lettre suivant un espace et les minuscules toute autre lettre.
la source
Utilisez le code suivant:
la source
Il semble qu'aucune des solutions données ici ne traite d'un espace blanc avant la chaîne.
Ajouter juste ceci comme une pensée:
Il devrait gérer
this won't work on other answers
(cette phrase a un espace au début), et si vous n'aimez pas le découpage de l'espace, passez simplement unfalse
second paramètre (ou changez la valeur par défaut enfalse
, et passeztrue
si vous voulez gérer l'espace)la source
FluentSharp a le
lowerCaseFirstLetter
méthode qui le faithttps://github.com/o2platform/FluentSharp/blob/700dc35759db8e2164771a71f73a801aa9379074/FluentSharp.CoreLib/ExtensionMethods/System/String_ExtensionMethods.cs#L575
la source
Le moyen le plus simple de mettre en majuscule sa première lettre est:
1- Utilisation de Sytem.Globalization;
"
la source
la fonction suivante est correcte dans tous les cas:
J'ai trouvé ça ici
la source
char.IsWhiteSpace( array[ i -1 ] )
place de.. == ' '
, pour gérer tous les espaces blancs. 2) supprimer les deux endroits qui le fontif (char.isLower(..))
- ils ne servent à rien.ToUpper
ne fait tout simplement rien si un caractère n'est pas en minuscules.En développant la question de Carlos ci-dessus, si vous souhaitez mettre en majuscule plusieurs phrases, vous pouvez utiliser ce code:
la source
Solution possible pour résoudre votre problème.
la source