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

あなたのアプローチは何ですか?

回答:


239

私は単純な連結を使用します:

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

最初のソリューションは最適化されstring.Formatていません。低速であるため、変更されることのないフォーマットがある場合は必要ありません。また、文字を小文字に変換する追加の文字列を生成しますが、これは不要です。

「+ 32」を使用したアプローチは、ASCII文字値オフセットの知識を必要とするため、見苦しい/保守できない。また、UnicodeデータとASCII記号文字を使用した誤った出力も生成されます。


4
私はそれをするだろう:char.ToLower(name[0]).ToString() + name.Substring(1)
アンドレイ

7
@Rookian:+多くの文字列を連結している場合、演算子は遅くなります。その場合、aのStringBuilder方がはるかにパフォーマンスが良くなります。ただし、+よりもはるかに高速ですstring.Format。実際に何か(整数、倍精度浮動小数点数、または日付の表示など)をフォーマットする必要がある場合は、後者を使用します。
Dirk Vollmar、2010

6
@ 0x03:たくさんの文字列を繰り返し連結している場合にのみ遅くなります。これらすべてを1つの操作で連結する場合+、コンパイラーはそれをaに変換するため、演算子はまったく遅くなりませんString.Concat(ただし、なんらかの理由でString.Joinより高速ですString.Concat)。
Thorarin

2
より速い方法はこれです:public static string ToFirstLetterLower(string text){var charArray = text.ToCharArray(); charArray [0] = char.ToLower(charArray [0]); 新しいstring(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声明はまた、とにかく変更するつもりはない場合は建設されてから新しい文字列を防止します。代わりにnull入力でメソッドを失敗させ、をスローすることができArgumentNullExceptionます。

人々が述べたように、String.Formatこれを使うのはやり過ぎです。


私が間違っている場合は修正してください。ただし、このメソッドのカウントが示されていないため、str.Substring(1)は位置1のシンボルを返します。したがって、小文字のchar [0] +位置1のcharになるので、文字列の最初の文字から1文字を削除することをお勧めします。結果は最初の文字のない文字列です。次に、この文字列を小文字に変換される最初の文字に追加します
fedotoves '25

3
@ B-Rain:自分で修正したと考えてください:msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx
Thorarin

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は、最初の文字を削除したいので(小文字のバージョンを前に追加しているため)
Riki

2

私は受け入れられた答えが好きですが、チェックのほかstring.IsNullOrEmptyChar.IsLower(name[1])、略語を扱っているかどうかもチェックします。たとえば、「AIDS」を「aIDS」にしたくないでしょう。


7
IMOこれは発信者の責任です
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
例外をスローすることが最善の解決策かどうかはわかりません。文字列がnullまたは空の場合、nullまたは空の文字列を返します。
R. de Veen

Stringがnullまたは空の場合、小文字に変更する最初の文字がないため、操作は意味がありません。
カルロスムニョス2018

0

これを使って:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.