BestPractice - 将字符串的第一个字符转换为小写

Roo*_*ian 130 .net c# string

我想有一个方法将字符串的第一个字符转换为小写.

我的方法:

1.

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

2.

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

你的方法是什么?

ono*_*nof 228

我会使用简单的连接:

Char.ToLowerInvariant(name[0]) + name.Substring(1)
Run Code Online (Sandbox Code Playgroud)

第一个解决方案没有优化,因为string.Format速度很慢,如果您的格式永远不会改变,则不需要它.它还会生成一个额外的字符串以将字母转换为小写,这是不需要的.

"+ 32"的方法很难/不可维护,因为它需要知道ASCII字符值偏移.它还会生成带有Unicode数据和ASCII符号字符的错误输出.

  • @Rookian:当你连接很多字符串时,`+`运算符很慢.在这种情况下,`StringBuilder`会表现得更好.但是,`+`比`string.Format`快得多.当你真正需要格式化某些东西时(例如显示整数,双精度或日期),请使用后者. (7认同)
  • @ 0x03:如果你迭代地连接很多字符串,它只会很慢.如果你在一个操作中将它们连接起来,那么`+`运算符根本不会很慢,因为编译器把它变成`String.Concat`(但是`String.Join`比`String.Concat`要快一些愚蠢的理由). (5认同)
  • 我会这样做:`char.ToLower(name [0]).ToString()+ name.Substring(1)` (4认同)
  • 更快的方法是:public static string ToFirstLetterLower(string text){var charArray = text.ToCharArray(); charArray [0] = char.ToLower(charArray [0]); 返回新字符串(charArray); } (2认同)
  • 我用扩展名`public static string ToLowerFirst(this string source){if(string.IsNullOrWhiteSpace(source))返回源码; var charArray = source.ToCharArray(); charArray [0] = char.ToLower(charArray [0]); 返回新字符串(charArray); }基于@MatteoMigliore的评论. (2认同)
  • 除非要在循环中串联字符串,否则担心+,stringbuilder,string.format或string.concat之间的差异是过早的优化。 (2认同)

Tho*_*rin 60

根据具体情况,可能需要一些防御性的编程:

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

    return Char.ToLowerInvariant(str[0]) + str.Substring(1);
}
Run Code Online (Sandbox Code Playgroud)

if语句还可以防止生成新字符串,如果它不会被改变的话.您可能希望该方法在null输入上失败,并抛出一个ArgumentNullException.

正如人们所提到的那样,使用String.Format它是过度的.

  • @ B-Rain:考虑自己纠正:http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx (2认同)

car*_*eel 5

以防它碰巧遇到任何碰巧碰到这个答案的人.

我认为这最好作为扩展方法,然后你可以使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我知道不滥用 c# 的最快解决方案:

public static string LowerCaseFirstLetter(string value)
{
    if (value?.Length > 0)
    {
        var letters = value.ToCharArray();
        letters[0] = char.ToLowerInvariant(letters[0]);
        return new string(letters);
    }
    return value;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

使用范围运算符 C# 8.0 或更高版本,您可以执行以下操作:

Char.ToLowerInvariant(name[0]) + name[1..];
Run Code Online (Sandbox Code Playgroud)