我有一个带有 TextBox
的 DetailsView
,我希望输入数据始终保存在FIRST LETTER IN CAPITAL中 .
Example:
"red" --> "Red"
"red house" --> " Red house"
我怎么能实现这个 maximizing performance ?
NOTE :
根据答案和答案下的评论,许多人认为这是在询问字符串中所有单词的大写 . 例如 . => Red House
It isn't, but if that is what you seek ,寻找使用 TitleInfo
的 ToTitleCase
方法的答案之一 . (注意:对于实际提出的问题,这些答案是不正确的 . )
有关警告,请参阅TextInfo.ToTitleCase doc(不触及所有大写单词 - 它们被视为首字母缩略词;可以降低单词中间的小写字母,例如"McDonald" => "Mcdonald";不保证能够处理所有特定于文化的细微差别重写大写规则 . )
NOTE :
关于第一个字母之后的字母是否应该是小写的问题是不明确的 . 接受的答案假定只应改变第一个字母 . 如果要强制除第一个字符串之外的字符串中的所有字母都是小写,请查找包含 ToLower
且不包含ToTitleCase的答案 .
30 回答
这是最快的方式:
无需更改原始字符串:
资本化冷杉信的最简单方法是:
1-使用Sytem.Globalization;
`
EDIT: 更新为更新的语法(以及更正确的答案),也作为扩展方法 .
OLD ANSWERS
EDIT :这个版本更短 . 如需更快的解决方案,请查看Equiso's answer
EDIT 2 :可能最快的解决方案是Darren's(有's even a benchmark) although I would change it' s
string.IsNullOrEmpty(s)
验证抛出异常,因为原始要求期望第一个字母存在,因此它可以是大写的 . 请注意,此代码适用于通用字符串,而不是特别适用于有效值来自Textbox
.旧答案:这使得每个第一个字母大写
正确的方法是使用文化:
Note: 这将大写字符串中的每个单词,例如"red house" - > "Red House" . 该解决方案还将在单词内进行小写大小写,例如"old McDonald" - > "Old Mcdonald" .
这样做虽然它也会确保没有错误的大写字母不在单词的开头 .
我从http://www.dotnetperls.com/uppercase-first-letter采取了最快的方法并转换为扩展方法:
注意:使用
ToCharArray
的原因比替代char.ToUpper(s[0]) + s.Substring(1)
快,是只分配了一个字符串,而Substring
方法为子字符串分配字符串,然后是第二个字符串来组成最终结果 .EDIT :这是这种方法的样子,结合CarlosMuñoz accepted answer的初始测试:
你可以使用“ToTitleCase方法”
这种扩展方法解决了每个 Headers 问题 .
易于使用
扩展方法
对于第一个字母,进行错误检查:
这里有一个方便的扩展
如果性能/内存使用是一个问题,那么这个只创建一(1)个StringBuilder和一(1)个与原始字符串大小相同的新String .
试试这个:
这是一种将其作为扩展方法的方法:
然后可以被称为:
这里有一些单元测试:
因为我也碰巧正在研究这个问题,并且正在寻找任何想法,这就是我的解决方案 . 它使用LINQ,并且能够大写字符串的第一个字母,即使第一个字母不是字母 . 这是我最终制作的扩展方法 .
我确信有一种方法可以优化或清理它 .
我在这里找到了一些东西http://www.dotnetperls.com/uppercase-first-letter:
也许这有帮助!!
如果您只关心第一个字母大写,并且字符串的其余部分无关紧要,您可以选择第一个字符,将其设置为大写,并将其与字符串的其余部分连接,而不使用原始的第一个字符 .
我们需要转换第一个字符ToString(),因为我们将它作为Char数组读取,而Char类型没有ToUpper()方法 .
当你需要的时候,似乎有很多复杂性:
值得注意的要点:
它是一种扩展方法 .
如果输入为null,为空或空格,则按原样返回输入 .
String.IsNullOrWhiteSpace被介绍了使用.NET Framework 4.这不适用于旧框架 .
最快的方法 .
测试显示下一个结果(输入10000000个符号的字符串):Test results
我想提供一个“最大性能”的答案 . 在我看来,“最大性能”答案捕获了所有场景,并提供了解决这些场景的问题的答案 . 所以,这是我的答案 . 有这些原因:
IsNullOrWhiteSpace考虑只是空格或空/空的字符串 .
.Trim()从字符串的正面和背面删除空格 .
.First()接受一个ienumerable(或字符串)的第一个字符 .
我们应该检查它是否是一个可以/应该是大写的字母 .
然后我们添加字符串的其余部分,只有长度表示我们应该 .
通过.Net最佳实践,我们应该在System.Globalization.CultureInfo下提供一种文化 .
将它们作为可选参数提供使得此方法完全可重用,无需每次都键入所选文化 .
我认为以下方法是最好的解决方案
ref
这将第一个字母和每个字母后面的空格和小写字母大写任何其他字母 .
Use the following code:
似乎这里给出的解决方案都不会在字符串之前处理空格 .
只是添加这个想法:
它应该处理
this won't work on other answers
(该句子在开头有空格),如果你不喜欢空格修剪,只需传递一个false
作为第二个参数(或者将默认值更改为false
,如果你想处理,则传递true
空间)FluentSharp具有
lowerCaseFirstLetter
方法,可以执行此操作https://github.com/o2platform/FluentSharp/blob/700dc35759db8e2164771a71f73a801aa9379074/FluentSharp.CoreLib/ExtensionMethods/System/String_ExtensionMethods.cs#L575
以下功能适用于所有方式:
我发现here
扩展上面的卡洛斯问题,如果你想要多个句子,你可以使用这个代码:
最近我有类似的要求,并记得LINQ函数Select()提供了一个索引:
由于我经常需要,我为字符串类型创建了一个扩展方法:
请注意,只有第一个字母转换为大写字母 - 所有剩余的字符都不会被触及 . 如果你需要其他字符为小写,你也可以调用Char.ToLower(currentChar)索引> 0或者首先在整个字符串上调用ToLower() .
关于性能,我将代码与Darren的解决方案进行了比较 . 在我的机器上,Darren的代码大约快2倍,这并不奇怪,因为他只是直接编辑char数组中的第一个字母 . 因此,如果您需要最快的解决方案,我建议您使用Darren的代码 . 如果你想集成其他的字符串操作,也可以方便地使lambda函数的表达能力接触输入字符串的字符 - 你可以很容易地扩展这个函数 - 所以我在这里留下这个解决方案 .
使用此方法,您可以高举每个单词的第一个字符 .
示例“HeLlo wOrld”=>“Hello World”
发送一个字符串到这个函数 . 它会首先检查字符串是空还是空,如果不是字符串将是所有较低的字符 . 然后返回字符串上面的其余部分的第一个字符 .