2010-08-25 181 views
105

我想要一个将字符串的第一个字符转换为小写的方法。BestPractice - 将字符串的第一个字符转换为小写

我的方法:

1.

public static string ReplaceFirstCharacterToLowerVariant(string name) 
{ 
    return String.Format("{0}{1}", name.First().ToString().ToLowerInvariant(), name.Substring(1)); 
} 

2.

public static IEnumerable<char> FirstLetterToLowerCase(string value) 
{ 
    var firstChar = (byte)value.First(); 
    return string.Format("{0}{1}", (char)(firstChar + 32), value.Substring(1)); 
} 

什么是你的做法?

回答

176

我这样做:

Char.ToLowerInvariant(name[0]) + name.Substring(1) 

你的第一个解决方案并没有得到优化的String.format是缓慢的,如果你有一个永远不变的格式,你不需要它。

第二个是丑陋的,不可维护。

+3

我会做:'char.ToLower(名称[0])的ToString()+ name.Substring(1)' – Andrey 2010-08-25 10:50:56

+0

是的,我刚刚更新我的答案,谢谢 – onof 2010-08-25 10:52:11

+0

我认为的concatination带有+运算符的字符串很慢很丑,不是吗? – Rookian 2010-08-25 11:02:12

3

煤矿是

if (!string.IsNullOrEmpty (val) && val.Length > 0) 
{ 
    return val[0].ToString().ToLowerInvariant() + val.Remove (0,1); 
} 
+3

我很好奇,为什么'val.Remove'?对我来说似乎有点不直观。 – Thorarin 2010-08-25 11:04:47

+0

@Thorarin显然是因为你想删除第一个字符(因为你在前面添加小写版本) – riki 2017-06-16 06:37:08

44

根据不同的情况,有点防御性编程可能是可取的:

public static string FirstCharacterToLower(string str) 
{ 
    if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) 
     return str; 

    return Char.ToLowerInvariant(str[0]) + str.Substring(1); 
} 

if声明还阻止新的字符串被建造,如果它不会是无论如何改变。您可能希望让方法在空输入上失败,并抛出一个ArgumentNullException

正如人们已经提到的那样,使用String.Format这是矫枉过正。

+7

+1用于检查你是否真的需要做任何事情。 :) – Chris 2010-08-25 11:04:40

+0

如果我错了,请纠正我,但 str.Substring(1)将返回位置1的符号,因为此方法的计数未指示。 所以你会有小写字母char [0] +位置1的字符 所以我最好从字符串中的第一个字符中删除一个字符。结果是没有第一个字母的字符串。然后我将这个字符串添加到转换为小写字母的第一个字符 – fedotoves 2010-08-25 11:34:55

+2

@ B-Rain:考虑自己更正:http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx – Thorarin 2010-08-25 13:37:21

2

我喜欢接受的答案,但除了检查string.IsNullOrEmpty我还会检查是否Char.IsLower(name[1])万一您正在处理缩写。例如。你不希望“艾滋病”成为“艾滋病”。

+3

IMO这是主叫方的责任 – onof 2013-03-16 11:17:05

-2

如果您知道格式不是更改数据,并且只需要连接,那么最好使用String.Concat而不是String.Format。

4

以防万一它碰巧遇到这个答案。

我认为这将是最好的扩展方法,那么你可以用yourString.FirstCharacterToLower()来调用它;

public static class StringExtensions 
{ 
    public static string FirstCharacterToLower(this string str) 
    { 
     if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) 
     { 
      return str; 
     } 

     return Char.ToLowerInvariant(str[0]) + str.Substring(1); 
    } 
} 
0

合并几个,并使其成为一个可链接的扩展。添加了空白和非字母短路。

public static string FirstLower(this string input) => 
    (!string.IsNullOrWhiteSpace(input) && input.Length > 0 
     && char.IsLetter(input[0]) && !char.IsLower(input[0])) 
    ? input[0].ToString().ToLowerInvariant() + input.Remove(0, 1) : input; 
相关问题