2010-08-25 230 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; 
相關問題