我想要一个将字符串的第一个字符转换为小写的方法。
我的方法:
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));
}
你的方法是什么?
答案 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
,并且只需要连接。