文字列の最初の文字を大文字にする(最高のパフォーマンスで)質問する

文字列の最初の文字を大文字にする(最高のパフォーマンスで)質問する

DetailsViewを含む があり、入力データの最初の文字が常に大文字で保存されるようTextBoxにしたいと考えています。

例:

"red" --> "Red"
"red house" --> " Red house"

このパフォーマンスを最大限に高めるにはどうすればよいでしょうか?


注記

回答と回答のコメントに基づいて、多くの人がこれは文字列内のすべての単語を大文字にすることに関する質問だと考えています。例=> Red House :そうではありませんが、それがあなたが求めているものである場合はTextInfo、のメソッドを使用する回答の1つを探してくださいToTitleCase。(注:これらの回答は、実際に尋ねられた質問に対して間違っています。)TextInfo.ToTitleCase ドキュメント注意点 (大文字の単語には影響しません。これらは頭字語とみなされます。小文字にすべきでない単語の途中の文字が小文字になる場合があります。例: "McDonald" → "Mcdonald"。大文字化のルールに関する文化固有の微妙な点をすべて処理できるとは限りません。)


注記

質問では、最初の文字以降の文字を強制的に小文字にするかどうかがあいまいです。受け入れられた回答では、最初の文字のみを変更することを前提としています。文字列内の最初の文字以外のすべての文字を強制的に小文字にしたい場合は、 が含まれ、ToTitleCase が含まれない回答を探してください。ToLower

ベストアンサー1

異なる C# バージョンでのソリューション

少なくとも .NET Core 3.0 または .NET Standard 2.1 を搭載した C# 8

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input) =>
        input switch
        {
            null => throw new ArgumentNullException(nameof(input)),
            "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
            _ => string.Concat(input[0].ToString().ToUpper(), input.AsSpan(1))
        };
}

.NET Core 3.0 / .NET Standard 2.1 では がString.Concat()サポートされているため、の代わりに をReadonlySpan<char>使用すると割り当てが 1 つ節約されます。.AsSpan(1).Substring(1)

C# 8

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input) =>
        input switch
        {
            null => throw new ArgumentNullException(nameof(input)),
            "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
            _ => input[0].ToString().ToUpper() + input.Substring(1)
        };
}

C# 7

public static class StringExtensions
{
    public static string FirstCharToUpper(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[0].ToString().ToUpper() + input.Substring(1);
        }
    }
}

本当に古い回答

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + String.Join("", input.Skip(1));
}

このバージョンは短いです。より速い解決策については、ディエゴの答え

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + input.Substring(1);
}

おそらく最も早い解決策はダレンの(ベンチマークもあります) ただし、string.IsNullOrEmpty(s)元の要件では最初の文字が存在することが期待されているため、大文字にすることができるため、例外をスローするように検証を変更します。このコードは一般的な文字列に対して機能し、 からの有効な値に対しては特に機能しないことに注意してくださいTextbox

おすすめ記事