1. ホーム
  2. c#

[解決済み] 文字列の最初の文字を大文字にする(最大限のパフォーマンスを発揮する)

2022-03-18 15:06:41

質問

私は DetailsViewTextBox が欲しいし 入力データ である 常時保存 と共に 最初の文字が大文字 .

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

どうすれば実現できますか? パフォーマンスの最大化 ?


備考 :

回答や回答下のコメントから、多くの人が、これは大文字と小文字の使い分けについて尋ねていると考えています。 すべて という文字列があります。例 => Red House そうではありませんが、もしあなたがそれを求めるのであれば を使っているものを探してください。 TextInfo 's ToTitleCase メソッドを使用します。(注)これらの回答は 不正解 は、実際に質問されたものです)。 参照 TextInfo.ToTitleCase ドキュメント は注意点です(全角の単語は扱わない - 頭文字とみなされる; 低くすべきでない単語の途中の文字を小文字にすることがある。例えば "McDonald" → "Mcdonald"); すべての文化特有の微妙な大文字ルールへの対処は保証されていません。


備考 :

質問内容は あいまい を使うのか、それとも 強制 から 小文字 . 受理された回答は、以下を想定しています。 最初の文字だけを変更する . もし、強制的に を除く文字列のすべての文字を を含む答えを探します。 ToLower ToTitleCaseを含まない .

解決方法は?

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 .