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

时间:2010-08-25 10:42:36

标签: c# .net string

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

我的方法:

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));
}

你的方法是什么?

11 个答案:

答案 0 :(得分:219)

我会使用简单的连接:

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

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

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

答案 1 :(得分:57)

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

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语句还可以防止生成新字符串,如果它不会被改变的话。您可能希望该方法在null输入上失败,并抛出ArgumentNullException

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

答案 2 :(得分:5)

以防万一碰巧遇到任何碰巧错过这个答案的人。

我认为这最好作为扩展方法,然后你可以用yourString.FirstCharacterToLower()调用它;

<your_template>/css/template.css

答案 3 :(得分:3)

我的是

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

答案 4 :(得分:2)

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

答案 5 :(得分: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;

答案 6 :(得分:0)

这是使用最新语法和正确验证的扩展方法

public static class StringExtensions
{
    public static string FirstCharToLower(this 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().ToLower() + input.Substring(1);
        }
    }
}

答案 7 :(得分:0)

使用此:

window

答案 8 :(得分:0)

我知道的不滥用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;
}

答案 9 :(得分:0)

如果您不想在表达式中两次引用字符串,则可以使用System.Linq

new string("Hello World".Select((c, i) => i == 0 ? char.ToLower(c) : c).ToArray())

这样,如果您的字符串来自某个函数,则不必存储该函数的结果。

new string(Console.ReadLine().Select((c, i) => i == 0 ? char.ToLower(c) : c).ToArray())

答案 10 :(得分:-3)

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