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


136

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

我的方法:

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

你会怎么做?

Answers:


239

我将使用简单的串联:

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

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

带“ + 32”的方法很丑陋/难以维护,因为它需要了解ASCII字符值偏移量。还会使用Unicode数据和ASCII符号字符生成不正确的输出。


4
我会这样做:char.ToLower(name[0]).ToString() + name.Substring(1)
Andrey

7
@Rookian:+串联多个字符串时,运算符速度很慢。在这种情况下,a的性能StringBuilder会更好。但是,+速度比快得多string.Format。当您实际需要格式化某些内容时(例如显示整数,双精度或日期),请使用后者。
德克·沃尔玛

6
@ 0x03:仅当您迭代地串联许多字符串时,它才很慢。如果将它们全部通过单个操作串联在一起,则该+运算符一点也不慢,因为编译器将其转换为a String.Concat(但是出于某些愚蠢的原因String.Join它的速度更快String.Concat)。
Thorarin 2010年

2
更快的方法是:公共静态字符串ToFirstLetterLower(string text){var charArray = text.ToCharArray(); charArray [0] = char.ToLower(charArray [0]); 返回新的字符串(charArray); }
Matteo Migliore 2014年

2
我使用了public static string ToLowerFirst(this string source) { if (string.IsNullOrWhiteSpace(source)) return source; var charArray = source.ToCharArray(); charArray[0] = char.ToLower(charArray[0]); return new string(charArray); } 基于@MatteoMigliore的注释的扩展名 。
KregHEk

64

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

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为此使用是过大的。


如果我错了,请纠正我,但是str.Substring(1)将返回位置1处的符号,因为未指示此方法的计数。因此,您将使用小写的char [0] +位置1的char。因此,我更希望从字符串中的第一个char开始删除一个char。结果是没有首字母的字符串。然后,我将此字符串添加到转换为小写字母的第一个字符
fedotoves 2010年


7

以防万一它偶然碰到这个答案会帮助任何人。

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

3

我的是

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

3
我很好奇,为什么val.Remove?对我来说似乎有点违反直觉。
Thorarin

@Thorarin显然是因为您要删除第一个字符(因为您要在前面添加小写字母)
Riki

2

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


7
国际海事组织,这是来电者的责任
2013年

1

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

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;

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

1
不知道抛出异常是否是最佳解决方案。字符串是空还是空,只需返回空或空字符串。
R. de Veen

如果String为null或为空,则该操作没有意义,因为没有第一个char可以更改为小写。
卡洛斯·穆尼奥斯

0

用这个:

string newName= name[0].ToString().ToLower() + name.Substring(1);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.