使string大写的第一个字母(具有最高性能)

我有一个TextBoxDetailsView ,我希望input的数据 总是保存在首字母大写。

例:

 "red" --> "Red" "red house" --> " Red house" 

我怎样才能达到这个最大化的performance



根据答案和答案的评论,很多人认为这是要求将string中的所有单词大写。 Eg => Red House 它不是,但如果这是你所寻求的 ,找一个使用TitleInfoToTitleCase方法的答案。 (注意:对于实际问题,这些答案是不正确的。)
请参阅TextInfo.ToTitleCase doc以了解警告(不会触及全部大写的单词 – 它们被认为是缩略词;可能会在“不应该”降低的单词中间显示小写字母,例如“McDonald”=>“Mcdonald”;不保证处理所有针对文化的细微差别重新规则。)



关于第一个字母是否应该被强制小写,这个问题是模棱两可的 。 接受的答案假设只有第一个字母应该改变 。 如果要强制除第一个string外的string中的所有字母都是小写字母 ,请查找包含ToLower 且不包含ToTitleCase的答案

编辑:更新到更新的语法(和更正确的答案)

 public static string FirstCharToUpper(string input) { switch (input) { case null: throw new ArgumentNullException(nameof(input)); case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)); default: return input.First().ToString().ToUpper() + input.Substring(1); } } 

老解答

 public static string FirstCharToUpper(string input) { if (String.IsNullOrEmpty(input)) throw new ArgumentException("ARGH!"); return input.First().ToString().ToUpper() + String.Join("", input.Skip(1)); } 

编辑 :这个版本更短。 为了更快的解决scheme, 请看Equiso的答案

 public static string FirstCharToUpper(string input) { if (String.IsNullOrEmpty(input)) throw new ArgumentException("ARGH!"); return input.First().ToString().ToUpper() + input.Substring(1); } 

编辑2 :也许最快的解决scheme是达伦的 (甚至有一个基准),虽然我会改变它的string.IsNullOrEmpty(s)validation抛出一个exception,因为原来的要求期望第一个字母存在,所以它可以uppercased。 请注意,此代码适用于通用string,而不适用于Textbox有效值。

 public string FirstLetterToUpper(string str) { if (str == null) return null; if (str.Length > 1) return char.ToUpper(str[0]) + str.Substring(1); return str.ToUpper(); } 

老答案:这使每个第一个字母大写

 public string ToTitleCase(string str) { return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower()); } 

正确的方法是使用文化:

 Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower()) 

你可以使用“ToTitleCase方法”

 string s = new CultureInfo("en-US").TextInfo.ToTitleCase("red house"); //result : Red House 

这个扩展方法解决了每一个问题。

容易使用

 string str = "red house"; str.ToTitleCase(); //result : Red house string str = "red house"; str.ToTitleCase(TitleCase.All); //result : Red House 

扩展方法

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; namespace Test { public static class StringHelper { private static CultureInfo ci = new CultureInfo("en-US"); //Convert all first latter public static string ToTitleCase(this string str) { str = str.ToLower(); var strArray = str.Split(' '); if (strArray.Length > 1) { strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]); return string.Join(" ", strArray); } return ci.TextInfo.ToTitleCase(str); } public static string ToTitleCase(this string str, TitleCase tcase) { str = str.ToLower(); switch (tcase) { case TitleCase.First: var strArray = str.Split(' '); if (strArray.Length > 1) { strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]); return string.Join(" ", strArray); } break; case TitleCase.All: return ci.TextInfo.ToTitleCase(str); default: break; } return ci.TextInfo.ToTitleCase(str); } } public enum TitleCase { First, All } } 

对于第一个字母,错误检查:

 public string CapitalizeFirstLetter(string s) { if (String.IsNullOrEmpty(s)) return s; if (s.Length == 1) return s.ToUpper(); return s.Remove(1).ToUpper() + s.Substring(1); } 

这就像一个方便的扩展一样

 public static string CapitalizeFirstLetter(this string s) { if (String.IsNullOrEmpty(s)) return s; if (s.Length == 1) return s.ToUpper(); return s.Remove(1).ToUpper() + s.Substring(1); } 

我采取了从http://www.dotnetperls.com/uppercase-first-letter最快的方法,并转换为扩展方法:;

  /// <summary> /// Returns the input string with the first character converted to uppercase, or mutates any nulls passed into string.Empty /// </summary> public static string FirstLetterToUpperCaseOrConvertNullToEmptyString(this string s) { if (string.IsNullOrEmpty(s)) return string.Empty; char[] a = s.ToCharArray(); a[0] = char.ToUpper(a[0]); return new string(a); } 

注意:使用ToCharArray的原因比替代的char.ToUpper(s[0]) + s.Substring(1)要快,因为只有一个string被分配,而Substring方法为Substring分配一个string,string来组成最终的结果。


编辑 :这是什么这种方法看起来,加上从CarlosMuñoz最初的testing接受的答案 :

  /// <summary> /// Returns the input string with the first character converted to uppercase /// </summary> public static string FirstLetterToUpperCase(this string s) { if (string.IsNullOrEmpty(s)) throw new ArgumentException("There is no first letter"); char[] a = s.ToCharArray(); a[0] = char.ToUpper(a[0]); return new string(a); } 
 public static string ToInvarianTitleCase(this string self) { if (string.IsNullOrWhiteSpace(self)) { return self; } return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(self); } 

如果性能/内存使用率是一个问题,那么这个只会创build一个(1)StringBuilder和一个(1)与原始string大小相同的新String。

 public static string ToUpperFirst(this string str) { if( !string.IsNullOrEmpty( str ) ) { StringBuilder sb = new StringBuilder(str); sb[0] = char.ToUpper(sb[0]); return sb.ToString(); } else return str; } 

尝试这个:

 static public string UpperCaseFirstCharacter(this string text) { return Regex.Replace(text, "^[az]", m => m.Value.ToUpper()); } 

因为我碰巧也在做这个工作,并且正在四处寻找任何想法,所以这是我来的解决scheme。 它使用LINQ,并且能够将string的首字母大写,即使第一个字母不是字母。 这是我最终做出的扩展方法。

 public static string CaptalizeFirstLetter(this string data) { var chars = data.ToCharArray(); // Find the Index of the first letter var charac = data.First(char.IsLetter); var i = data.IndexOf(charac); // capitalize that letter chars[i] = char.ToUpper(chars[i]); return new string(chars); } 

我确信有一种方法可以优化或清理一点点。

我在这里find了一些东西http://www.dotnetperls.com/uppercase-first-letter

 static string UppercaseFirst(string s) { // Check for empty string. if (string.IsNullOrEmpty(s)) { return string.Empty; } // Return char and concat substring. return char.ToUpper(s[0]) + s.Substring(1); } 

也许这有助于!

这将做到这一点,虽然它也将确保没有错误的首都不是在字的开头。

 public string(string s) { System.Globalization.CultureInfo c = new System.Globalization.CultureInfo("en-us", false) System.Globalization.TextInfo t = c.TextInfo; return t.ToTitleCase(s); } 

以下是一种扩展方法:

 static public string UpperCaseFirstCharacter(this string text) { if (!string.IsNullOrEmpty(text)) { return string.Format( "{0}{1}", text.Substring(0, 1).ToUpper(), text.Substring(1)); } return text; } 

然后可以这样调用:

 //yields "This is Brian's test.": "this is Brian's test.".UpperCaseFirstCharacter(); 

这里有一些unit testing:

 [Test] public void UpperCaseFirstCharacter_ZeroLength_ReturnsOriginal() { string orig = ""; string result = orig.UpperCaseFirstCharacter(); Assert.AreEqual(orig, result); } [Test] public void UpperCaseFirstCharacter_SingleCharacter_ReturnsCapital() { string orig = "c"; string result = orig.UpperCaseFirstCharacter(); Assert.AreEqual("C", result); } [Test] public void UpperCaseFirstCharacter_StandardInput_CapitalizeOnlyFirstLetter() { string orig = "this is Brian's test."; string result = orig.UpperCaseFirstCharacter(); Assert.AreEqual("This is Brian's test.", result); } 

如果你只关心第一个字母是大写字母而不关心string的其余部分,那么你可以select第一个字符,把它换成大写字母,并把它和string的其余部分连接起来,而不需要原始的第一个字符。

 String word ="red house"; word = word[0].ToString().ToUpper() + word.Substring(1, word.length -1); //result: word = "Red house" 

我们需要转换第一个字符ToString(),因为我们正在将它作为一个Char数组读取,而Chartypes没有ToUpper()方法。

 string emp="TENDULKAR"; string output; output=emp.First().ToString().ToUpper() + String.Join("", emp.Skip(1)).ToLower(); 

当你需要的时候,似乎有很多的复杂性:

  /// <summary> /// Returns the input string with the first character converted to uppercase if a letter /// </summary> /// <remarks>Null input returns null</remarks> public static string FirstLetterToUpperCase(this string s) { if (string.IsNullOrWhiteSpace(s)) return s; return char.ToUpper(s[0]) + s.Substring(1); } 

值得注意的一点:

  1. 它是一个扩展方法。

  2. 如果input为空,空或空白,则input按原样返回。

  3. 在.NET Framework 4中引入了String.IsNullOrWhiteSpace。这不适用于较旧的框架。

这首字母和空格后的每个字母大写,小写其他任何字母。

 public string CapitalizeFirstLetterAfterSpace(string input) { System.Text.StringBuilder sb = new System.Text.StringBuilder(input); bool capitalizeNextLetter = true; for(int pos = 0; pos < sb.Length; pos++) { if(capitalizeNextLetter) { sb[pos]=System.Char.ToUpper(sb[pos]); capitalizeNextLetter = false; } else { sb[pos]=System.Char.ToLower(sb[pos]); } if(sb[pos]=' ') { capitalizeNextLetter=true; } } } 

使用下面的代码:

 string strtest ="PRASHANT"; strtest.First().ToString().ToUpper() + strtest.Remove(0, 1).ToLower(); 

似乎这里给出的解决scheme都不会处理string之前的空格。

只要加上这个想法:

 public static string SetFirstCharUpper2(string aValue, bool aIgonreLeadingSpaces = true) { if (string.IsNullOrWhiteSpace(aValue)) return aValue; string trimmed = aIgonreLeadingSpaces ? aValue.TrimStart() : aValue; return char.ToUpper(trimmed[0]) + trimmed.Substring(1); } 

它应该处理this won't work on other answers (该句子在开始的空间),如果你不喜欢空间修剪,只是传递一个false作为第二个参数(或更改默认值为false ,并通过如果你想处理空间是true

这是最快的方法:

 public static unsafe void ToUpperFirst(this string str) { if (str == null) return; fixed (char* ptr = str) *ptr = char.ToUpper(*ptr); } 

不改变原始string:

 public static unsafe string ToUpperFirst(this string str) { if (str == null) return null; string ret = string.Copy(str); fixed (char* ptr = ret) *ptr = char.ToUpper(*ptr); return ret; } 

首字母大写的最简单的方法是:

1-使用Sytem.Globalization;

  // Creates a TextInfo based on the "en-US" culture. TextInfo myTI = new CultureInfo("en-US",false). myTI.ToTitleCase(textboxname.Text) 

`

最快的方法。

  private string Capitalize(string s){ if (string.IsNullOrEmpty(s)) { return string.Empty; } char[] a = s.ToCharArray(); a[0] = char.ToUpper(a[0]); return new string(a); } 

testing显示下一个结果(以10000000个符号作为input的string): testing结果

以下function对于所有方式都是正确的:

 static string UppercaseWords(string value) { char[] array = value.ToCharArray(); // Handle the first letter in the string. if (array.Length >= 1) { if (char.IsLower(array[0])) { array[0] = char.ToUpper(array[0]); } } // Scan through the letters, checking for spaces. // ... Uppercase the lowercase letters following spaces. for (int i = 1; i < array.Length; i++) { if (array[i - 1] == ' ') { if (char.IsLower(array[i])) { array[i] = char.ToUpper(array[i]); } } } return new string(array); } 

我在这里find了

正如BobBeechey在回答这个问题时所build议的那样,下面的代码可以解决这个问题:

 private void txt_fname_TextChanged(object sender, EventArgs e) { char[] c = txt_fname.Text.ToCharArray(); int j; for (j = 0; j < txt_fname.Text.Length; j++) { if (j==0) c[j]=c[j].ToString().ToUpper()[0]; else c[j] = c[j].ToString().ToLower()[0]; } txt_fname.Text = new string(c); txt_fname.Select(txt_fname.Text.Length, 1); } 

用这个方法你可以放上每个单词的第一个字符。

例如“HeLlo wOrld”=>“Hello World”

 public static string FirstCharToUpper(string input) { if (String.IsNullOrEmpty(input)) throw new ArgumentException("Error"); return string.Join(" ", input.Split(' ').Select(d => d.First().ToString().ToUpper() + d.ToLower().Substring(1))); } 

发送一个string到这个函数。 它会首先检查string是否为空或空string,如果不是string将全部为低字符。 然后返回它们上面的string的第一个字符。

 string FirstUpper(string s) { // Check for empty string. if (string.IsNullOrEmpty(s)) { return string.Empty; } s = s.ToLower(); // Return char and concat substring. return char.ToUpper(s[0]) + s.Substring(1); } 

I use this to correct names. It basically works on the concept of changing a character to uppercase if it follows a specific pattern, in this case I've gone for space, dash of "Mc".

 private String CorrectName(String name) { List<String> StringsToCapitalizeAfter = new List<String>() { " ", "-", "Mc" }; StringBuilder NameBuilder = new StringBuilder(); name.Select(c => c.ToString()).ToList().ForEach(c => { c = c.ToLower(); new List<String>() { " ", "-", "Mc" }.ForEach(s => { if(String.IsNullOrEmpty(NameBuilder.ToString()) || NameBuilder.ToString().EndsWith(s)) { c = c.ToUpper(); } }); NameBuilder.Append(c); }); return NameBuilder.ToString(); } 

TextInfo ti = CultureInfo.CurrentCulture.TextInfo;
Console.WriteLine(ti.ToTitleCase(inputString));

 string input = "red HOUSE"; System.Text.StringBuilder sb = new System.Text.StringBuilder(input); for (int j = 0; j < sb.Length; j++) { if ( j == 0 ) //catches just the first letter sb[j] = System.Char.ToUpper(sb[j]); else //everything else is lower case sb[j] = System.Char.ToLower(sb[j]); } // Store the new string. string corrected = sb.ToString(); System.Console.WriteLine(corrected);