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


447

私にはa DetailsViewがありTextBox入力データは常に FIRST LETTER IN CAPITAL で保存する必要があります

例:

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

この最大のパフォーマンスを実現するにはどうすればよいですか?



回答と回答の下のコメントに基づいて、多くの人は、これは文字列内のすべての単語を大文字にすることについて尋ねていると考えています。たとえば、そう=> Red House ではありませんが、それがあなたの求めるものである場合はTextInfoToTitleCase方法を使用する答えの1つを探してください。(注:これらの回答は、実際に尋ねられた質問に対しては正しくありません。)警告
については、TextInfo.ToTitleCaseのドキュメントを参照してください(すべて大文字の単語には触れない-頭字語と見なされます。 「McDonald」=>「Mcdonald」などのように下げられます。カルチャ固有の微妙な再大文字化ルールをすべて処理することは保証されていません。



質問はあいまいな最初の後の文字がする必要があるかどうかの強制する場合を下げます。受け入れられた回答では、最初の文字のみを変更する必要があると想定しています。文字列内の最初の文字を除くすべての文字を小文字にしたい場合は、を含みToLowerToTitleCaseを含まない回答を探します。


7
@Bobby:重複ではありません。OPは文字列の最初の文字を大文字にするように求めます。リンクの質問では、各単語の最初の文字を大文字にします。
GvS 2010年

1
@GvS:最初の答えは非常に詳細で、最初のコードブロックはまさに彼が探しているものです。また、すべての単語を大文字にすることと最初の単語だけを大文字にすることは、ループの違いが1つだけです。
ボビー

これを正常に解決したことはありますか?これでまだ助けが必要ですか?
jcolebrand 2010

1
しかし、あなたが言った、そして私は引用して、「それぞれの単語の最初の文字を大文字にしなさい」。したがって、なぜ「赤い家」→「赤い家」なのでしょうか。「家」の「h」が大文字ではないのはなぜですか?
GuillermoGutiérrez2012年

最初に空白がある場合、ほとんどの回答は失敗するため、回答を追加しました。これを各回答に投稿しないようにするため、ここに1回投稿します。
Noctis、2014年

回答:


583

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.First().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.First().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));
}

編集:このバージョンは短いです。より高速なソリューションについては、Equisoの回答ご覧ください

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

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


2
の最初のパラメータはString.Join、2番目のパラメータで指定された文字列を結合するセパレータです。
Dialecticus

27
私はあなたの答えが本当に好きvar arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr);ですが、不変のオブジェクトを作成しているので(特にをスキップしているためString.Join)、おそらくある程度の速度が得られます。もちろん、これは文字列の長さに依存します。
flindeberg 2013

3
素晴らしい-Linqを使用すると、このコードの機能が非常に明確になります。
Daniel James Bryars 2013年

7
うーん...技術的には、これは大文字の最初の文字のルール"Argh!"を維持するために戻るはずです。;)
jp2code 2015

2
@ jp2code nullまたは空の文字列で存在しない最初の文字を大文字にするのは、妊娠中のイルカに叩かれるようなものなので、すべて大文字です。正しいスペルです。urbandictionary.com/define.php?term=ARGH&defid=67839
カルロス・ムニョス

319
public string FirstLetterToUpper(string str)
{
    if (str == null)
        return null;

    if (str.Length > 1)
        return char.ToUpper(str[0]) + str.Substring(1);

    return str.ToUpper();
}

古い答え:これはすべての最初の文字を大文字にします

public string ToTitleCase(string str)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}

ただし、これにより、文字列の最初の文字だけでなく、単語の最初のすべての文字が大文字に変換されます。
GvS 2010年

@GvS、それは質問があなたに何をするように求めているかです。
thattolleyguy 2010年

17
「赤い家」=>「赤い家」と尋ねる。ToTitleCaseは "Red House"を提供します。
GvS 2010年

1
私に役立つ。すばらしい
Ehsan Sajjad

1
これについては不明ですが、char + stringはボクシングを引き起こします。念のため、最大のパフォーマンスが必要です。
nawfal 2017

163

正しい方法は、カルチャーを使用することです。

System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower())

注:これにより、文字列内の各単語が大文字になります(例: "red house"-> "Red House")。ソリューションでは、単語内の大文字も小文字になります。例:「古いマクドナルド」->「古いマクドナルド」。


4
これは、ホイールを再発明して独自のバージョンを作成するのではなく、最も適切な方法です。
Alexey Shevelyov 2016

12
これに関して私が抱えている問題は、文字列の途中にある有効な可能性のある大文字を消去することです。例:McNames
Jecoms

29
これは、「赤い家」が「赤い家」になる理由(「H」に注意してください)の誤った回答です。
spaark 2016

21
質問されてから6年後、既存の回答とそのコメントをより徹底的に読んでください。あなたがよりよい解決策を持っている確信している場合は、表示さあなたが考える方法で、あなたの答えの振る舞いが優れている状況を、具体的にどのように既存の回答から、その異なります。1)Equisoは彼の回答の後半ですでにこのオプションをカバーしています。2)多くの状況で、これToLowerは間違いです。たとえば、「マクドナルド」のように、大文字を途中で一掃してしまいます。3)問題はTitleCase ではなく、文字列の最初の単語のみを変更することです。
ToolmakerSteve 2017

10
これにより、入力が「タイトルケース」に変わります。つまり、「赤い馬」が「赤い馬」に変わります。一方、これを行うべきではない(そして「赤い馬」を返す)ことを明確に要求している人。これは正しい方法ではありません。
ヘッカリク2017

68

私はhttp://www.dotnetperls.com/uppercase-first-letterから最速のメソッドを取得し、拡張メソッドに変換しました。

    /// <summary>
    /// Returns the input string with the first character converted to uppercase, or mutates any nulls passed into string.Empty
    /// </summary>
    public static string FirstLetterToUpperCaseOrConvertNullToEmptyString(this string s)
    {
        if (string.IsNullOrEmpty(s))
            return string.Empty;

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

注:を使用する理由ToCharArrayは、代替よりも高速ですchar.ToUpper(s[0]) + s.Substring(1)。1つの文字列のみが割り当てられるので、Substringアプローチでは部分文字列に文字列を割り当て、次に2番目の文字列を割り当てて最終結果を作成します。


編集:これは、このアプローチがどのように見えるかであり、CarlosMuñozの最初のテストと組み合わせて受け入れられた答え

    /// <summary>
    /// Returns the input string with the first character converted to uppercase
    /// </summary>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrEmpty(s))
            throw new ArgumentException("There is no first letter");

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

パフォーマンスメトリックを見つけて、優れたパフォーマンスのソリューションを示してくれてありがとう!
ToolmakerSteve

@ToolmakerSteve、実際に他のソリューションよりも高速に見えるため、私はこのソリューションが好きですが、これには少し問題があります。nullを渡す場合、出力として空の文字列を取得しないでください。実際、OPが最初の文字を要求するため、空の文字列を渡しても例外がスローされるはずだと私は主張します。また、編集する前に他の人の答えにコメントすることもできます。
カルロス・ムニョス

@CarlosMuñoz-他の人の答えを「改善する」かどうかは、メタで議論されています。コンセンサスは、「もしあなたが答えを改善できるなら、そうすることです-誰も答えを「所有」することはなく、元の作者でさえも-目標は可能な限り最良の答えを得ることです」でした。もちろん、編集は自由に編集またはロールバックできます。その場合、一般的な礼儀では、元の作者のバージョンを最終結果とし、私はコメントすることにします。通常、私はまた、コメントで私が作っています変更を置きます。私がしなかった場合、私は謝罪します。
ToolmakerSteve 2017

@CarlosMuñoz-特に、SOには多くの回答があり、積極的に維持されていません。変更によって回答が改善される場合は、なぜコメントに埋め込んでおくのですか?作成者が回答を積極的に監視している場合は、適切と思われる変更を行います。そうでない場合は、答えが改善され、全員の利益になります。この原則は、このような古いQ&Aに特に当てはまります。
ToolmakerSteve 2017

ところで、私はメソッドの開始時のテストについて@CarlosMuñozに同意します-そのテストの彼のバージョンはより良いプログラミングスタイルです- return string.Emptyここではメソッドへの「悪い」呼び出しを隠します。
ToolmakerSteve 2017

46

「ToTitleCaseメソッド」を利用できます

string s = new CultureInfo("en-US").TextInfo.ToTitleCase("red house");
//result : Red House

この拡張メソッドは、すべてのタイトルケースの問題を解決します。

使いやすい

string str = "red house";
str.ToTitleCase();
//result : Red house

string str = "red house";
str.ToTitleCase(TitleCase.All);
//result : Red House

拡張メソッド

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Test
{
    public static class StringHelper
    {
        private static CultureInfo ci = new CultureInfo("en-US");
        //Convert all first latter
        public static string ToTitleCase(this string str)
        {
            str = str.ToLower();
            var strArray = str.Split(' ');
            if (strArray.Length > 1)
            {
                strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                return string.Join(" ", strArray);
            }
            return ci.TextInfo.ToTitleCase(str);
        }
        public static string ToTitleCase(this string str, TitleCase tcase)
        {
            str = str.ToLower();
            switch (tcase)
            {
                case TitleCase.First:
                    var strArray = str.Split(' ');
                    if (strArray.Length > 1)
                    {
                        strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                        return string.Join(" ", strArray);
                    }
                    break;
                case TitleCase.All:
                    return ci.TextInfo.ToTitleCase(str);
                default:
                    break;
            }
            return ci.TextInfo.ToTitleCase(str);
        }
    }

    public enum TitleCase
    {
        First,
        All
    }
}

あなたの解決策の問題は、質問で尋ねられたように、「赤い家」が「赤い家」ではなく「赤い家」に変換されることです。
Vadim 2013年

3
@Tacttin機能しますが、次のコードは読みやすく、パフォーマンスが向上しますchar.ToUpper(text [0])+((text.Length> 1)?text.Substring(1).ToLower():string.Empty) ; もっと読むことができます@ vkreynin.wordpress.com
Vadim

1
このソリューションは、2つのまったく異なる状況を1つの長い方法に結合するため、好きではありません。概念的なメリットもわかりません。そして、最初の文字だけを大文字にする実装はばかげています。最初の文字を大文字にしたい場合、明白な実装は最初の文字を(ToUpper)だけ大文字にすることです。これの代わりに、2つの方法があります。FirstLetterToUpperEquisoの回答(またはGuillernetの新しい回答)とToTitleCaseここでは、2番目のパラメーターなし。その後、必要はありませんenum TitleCase
ToolmakerSteve

31

最初の文字について、エラーチェックあり:

public string CapitalizeFirstLetter(string s)
{
    if (String.IsNullOrEmpty(s))
        return s;
    if (s.Length == 1)
        return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
}

そして、これは便利な拡張機能と同じです

public static string CapitalizeFirstLetter(this string s)
    {
    if (String.IsNullOrEmpty(s)) return s;
    if (s.Length == 1) return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
    }

クリーンなアプローチ。ありがとうございました!
フィリップ

11
public static string ToInvarianTitleCase(this string self)
{
    if (string.IsNullOrWhiteSpace(self))
    {
        return self;
    }

    return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(self);
}

6

パフォーマンス/メモリの使用に問題がある場合、これは、元の文字列と同じサイズの1つのStringBuilderと1つの新しい文字列のみを作成します。

public static string ToUpperFirst(this string str) {
  if( !string.IsNullOrEmpty( str ) ) {
    StringBuilder sb = new StringBuilder(str);
    sb[0] = char.ToUpper(sb[0]);

    return sb.ToString();

  } else return str;
}

3
これは簡単なことで行うことができます char[]すべてのインフラストラクチャをStringBuilderラップするのではなくで。の代わりにnew StringBuilder(str)を使用しstr.ToCharArray()、の代わりにsb.ToString()を使用してくださいnew string(charArray)StringBuilder文字配列がネイティブに公開するインデックスのタイプをエミュレートするため、実際の.ToUpper行は基本的に同じにすることができます。:-)
ジョナサンギルバート

ダレン(年後)を使用してこれを行う方法を示していますToCharArray@JonathanGilbertにより示唆されるように、
ToolmakerSteve

6

最速の方法。

  private string Capitalize(string s){
        if (string.IsNullOrEmpty(s))
        {
            return string.Empty;
        }
        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
}

テストは次の結果を表示します(入力として10000000シンボルの文字列): テスト結果


1
snullまたは空のときにパラメーターを返すことをお勧めします。
MatrixRonny

4

これを試して:

static public string UpperCaseFirstCharacter(this string text) {
    return Regex.Replace(text, "^[a-z]", m => m.Value.ToUpper());
}

2
またはおそらく他のいくつかの文字クラス(つまり、英数字\ w)で、関数はUnicode対応です
Dmitry Ledentsov '26

@ DmitryLedentsov- C#文字列クラスはUTF-16文字に基づいて構築されています。文字列クラス "テキストを一連のUTF-16コード単位として表します。"
ToolmakerSteve 2017

4

最初の文字だけが大文字であることに注意して、残りの文字列が問題にならない場合は、最初の文字を選択し、大文字にして、元の最初の文字のない残りの文字列と連結できます。

String word ="red house";
word = word[0].ToString().ToUpper() + word.Substring(1, word.length -1);
//result: word = "Red house"

最初の文字ToString()を変換する必要があるのは、Char配列として読み取っており、Char型にはToUpper()メソッドがないためです。


3

これを拡張メソッドとして行う方法は次のとおりです。

static public string UpperCaseFirstCharacter(this string text)
{
    if (!string.IsNullOrEmpty(text))
    {
        return string.Format(
            "{0}{1}",
            text.Substring(0, 1).ToUpper(),
            text.Substring(1));
    }

    return text;
}

その後、次のように呼び出すことができます:

//yields "This is Brian's test.":
"this is Brian's test.".UpperCaseFirstCharacter(); 

そして、それのためのいくつかの単体テストがあります:

[Test]
public void UpperCaseFirstCharacter_ZeroLength_ReturnsOriginal()
{
    string orig = "";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual(orig, result);
}

[Test]
public void UpperCaseFirstCharacter_SingleCharacter_ReturnsCapital()
{
    string orig = "c";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("C", result);
}

[Test]
public void UpperCaseFirstCharacter_StandardInput_CapitalizeOnlyFirstLetter()
{
    string orig = "this is Brian's test.";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("This is Brian's test.", result);
}

1
string.Formatやり過ぎです。単に行いますtext.Substring(0, 1).ToUpper() + text.Substring(1)
ToolmakerSteve 2017

3

私もたまたまこれに取り組んでいて、アイデアを探していたので、これが私の解決策です。LINQを使用しており、最初の文字が文字でなくても、文字列の最初の文字を大文字にすることができます。これが私が作成した拡張メソッドです。

public static string CaptalizeFirstLetter(this string data)
{
    var chars = data.ToCharArray();

    // Find the Index of the first letter
    var charac = data.First(char.IsLetter);
    var i = data.IndexOf(charac);

    // capitalize that letter
    chars[i] = char.ToUpper(chars[i]);

    return new string(chars);
}

これを少し最適化またはクリーンアップする方法があると確信しています。



3

文字列がnullではないことを確認してから、最初の文字を大文字に変換し、残りの文字を小文字に変換します。

public static string FirstCharToUpper(string str)
{
    return str?.First().ToString().ToUpper() + str?.Substring(1).ToLower();
}

文字列の単語だけの数行のコードではなく、小さな解決策をありがとう!
Imran Faruqi

2

これでうまくいきますが、単語の先頭にない誤った大文字がないことも確認されます。

public string(string s)
{
System.Globalization.CultureInfo c = new System.Globalization.CultureInfo("en-us", false)
System.Globalization.TextInfo t = c.TextInfo;

return t.ToTitleCase(s);
}

2
sToTitleCaseを呼び出す前にnullチェックが必要です。
Taras Alenin 2014年

@CarlosMuñoztlhIngan Holのスクリプトには大文字と小文字の区別がありません。:-)
ジョナサンギルバート

2

必要なのが次の場合、ここには多くの複雑さがあるようです。

    /// <summary>
    /// Returns the input string with the first character converted to uppercase if a letter
    /// </summary>
    /// <remarks>Null input returns null</remarks>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrWhiteSpace(s))
            return s;

        return char.ToUpper(s[0]) + s.Substring(1);
    }

注目すべき点:

  1. その拡張メソッドです。

  2. 入力がnull、空、または空白の場合、入力はそのまま返されます。

  3. String.IsNullOrWhiteSpaceは.NET Framework 4で導入されました。これは古いフレームワークでは機能しません。


1
これが4年前の元の承認された回答をどのように改善したかはわかりません。実際には、それは矛盾以降を使用しての唯一の利点:(無害そう、しかし四年後半に、私は、新しい答えの追加利益のために高い基準を持っている)IsNullOrWhiteSpaceのではなく、IsNullOrEmptyあなたがしようとしている場合、ある検索および変更最初の非をホワイトスペース。ただし、そうではありませんs[0]。常に動作します。したがって、使用しても意味がありません(セマンティックとパフォーマンスの両方)IsNullOrWhiteSpace
ToolmakerSteve 2017

...この使用法がIsNullOrWhiteSpace私を困らせる理由は、不注意な読者が「空白をチェックしたので、次のコードは実際に空白が先行していても、文字を検索して変更する」と考えるかもしれないということです。コードは空白が先行する「最初の」文字の変更に失敗するため、使用すると読者を誤解させるIsNullOrWhiteSpaceだけです。
ToolmakerSteve

...おっと、私は受け入れられた答えを意味するのではなく、同じ期間からのEquisoの答えを意味します。
ToolmakerSteve 2017

1
string emp="TENDULKAR";
string output;
output=emp.First().ToString().ToUpper() + String.Join("", emp.Skip(1)).ToLower();

なぜToLower()が末尾にあるのですか?最初の文字以外の文字は必要ありません。
カルロス・ムニョス

String何もすることができているそのUpperまたはLowerすべての文字列のための汎用的なソリューションの.so。
Shailesh 2013

なぜJoin代わりにemp.First().ToString().ToUpper() + emp.Substring(1);?おそらくさらに防御力も必要です:output = string.IsNullOrEmpty(emp) ? string.Empty : [...]。また、fwiw、@CarlosMuñozに同意しますToLower()-OPの質問にはは必要ありません。
ルフィン

@ ruffin->使用Substring もコードの優れた書き込みスタイルです。コードをトリムするためのソリューションに同意しますが、この場合、 ToLower()プログラミングは優れたプログラミング手法です。stringでは何もすることができますUpperケースやLowerケースは、ユーザー入力に依存し、私は一般的な溶液を得ました。
Shailesh

@Shailesh-ただし、質問では最初の文字のみを大文字にすること要求されませんでした。最初の文字を大文字に変更するよう求めた。著者からのさらなる明確化なしに、最も自然な仮定は、文字列の残りの部分は変更されないということです。あなたが3年後回答しているとすると、受け入れられた回答質問者の要求どおりに機能すると想定してください。別の方法で行う技術的な理由がある場合にのみ、別の答えを出してください。
ToolmakerSteve 2017

1

「最高のパフォーマンス」の答えを提供したいと思いました。私の考えでは、「最大パフォーマンス」の回答はすべてのシナリオを捉え、それらのシナリオを説明する質問への回答を提供します。だから、これが私の答えです。これらの理由により:

  1. IsNullOrWhiteSpaceは、スペースまたはnull /空の文字列のみを考慮します。
  2. .Trim()は、文字列の前後の空白を削除します。
  3. .First()は、ienumerable(または文字列)の最初の文字を取ります。
  4. 大文字にすることができる/すべきかどうかを確認する必要があります。
  5. 次に、長さが適切であると示されている場合にのみ、残りの文字列を追加します。
  6. .Netのベストプラクティスでは、System.Globalization.CultureInfoの下にカルチャを提供する必要があります。
  7. それらをオプションのパラメーターとして提供すると、このメソッドは完全に再利用可能になり、選択したカルチャを毎回入力する必要がなくなります。

    public static string capString(string instring, string culture = "en-US", bool useSystem = false)
    {
        string outstring;
        if (String.IsNullOrWhiteSpace(instring))
        {
            return "";
        }
        instring = instring.Trim();
        char thisletter = instring.First();
        if (!char.IsLetter(thisletter))
        {
            return instring;   
        }
        outstring = thisletter.ToString().ToUpper(new CultureInfo(culture, useSystem));
        if (instring.Length > 1)
        {
            outstring += instring.Substring(1);
        }
        return outstring;
    }

2
これはほとんどの場合をカバーしますが、各操作で作成される文字列の数を考えると、かなり遅くなりませんか?ここでは大量の文字列割り当てが行われています。好ましくは、それは一度だけ、そして一度だけ割り当てられるだろう。
Douglas Gaskell 2018

1

最近、同様の要件があり、LINQ関数Select()がインデックスを提供することを思い出しました:

string input;
string output;

input = "red house";
output = String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
//output = "Red house"

それが非常に頻繁に必要になるので、文字列型の拡張メソッドを作成しました。

public static class StringExtensions
{
    public static string FirstLetterToUpper(this string input)
    {
        if (string.IsNullOrEmpty(input))
            return string.Empty;
        return String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
    }
}

最初の文字だけが大文字に変換されることに注意してください-残りのすべての文字は変更されません。他の文字を小文字にする必要がある場合は、インデックス> 0に対してChar.ToLower(currentChar)を呼び出すか、最初に文字列全体に対してToLower()を呼び出すこともできます。

パフォーマンスについては、コードをダレンのソリューションと比較しました。私のマシンでは、Darrenのコードは約2倍高速です。これは、char配列内の最初の文字のみを直接編集しているため、驚くことではありません。したがって、最速のソリューションが必要な場合は、Darrenのコードを使用することをお勧めします。他の文字列操作も統合する場合は、ラムダ関数の表現力を入力文字列の文字に接触させると便利です。この関数を簡単に拡張できるため、このソリューションはここに残します。


私はこの問題をどのように解決し、自分の解決策を考え出し、それから投稿するために戻ってきて、私がすでに持っていたものとまったく同じ解決策を思いついたのを見つけました。あなたに+1!
BlueFuzzyThing

どうもありがとうございました。
グリム

1

以下の方法が最良の解決策だと思います

    class Program
{
    static string UppercaseWords(string value)
    {
        char[] array = value.ToCharArray();
        // Handle the first letter in the string.
        if (array.Length >= 1)
        {
            if (char.IsLower(array[0]))
            {
                array[0] = char.ToUpper(array[0]);
            }
        }
        // Scan through the letters, checking for spaces.
        // ... Uppercase the lowercase letters following spaces.
        for (int i = 1; i < array.Length; i++)
        {
            if (array[i - 1] == ' ')
            {
                if (char.IsLower(array[i]))
                {
                    array[i] = char.ToUpper(array[i]);
                }
            }
        }
        return new string(array);
    }

    static void Main()
    {
        // Uppercase words in these strings.
        const string value1 = "something in the way";
        const string value2 = "dot net PERLS";
        const string value3 = "String_two;three";
        const string value4 = " sam";
        // ... Compute the uppercase strings.
        Console.WriteLine(UppercaseWords(value1));
        Console.WriteLine(UppercaseWords(value2));
        Console.WriteLine(UppercaseWords(value3));
        Console.WriteLine(UppercaseWords(value4));
    }
}

Output

Something In The Way
Dot Net PERLS
String_two;three
 Sam

ref


1

この質問はパフォーマンス最大化することに関するものなので、私はSpans を使用するためにダレンのバージョンを採用しました。これは、ゴミを減らし、速度を約10%向上させます。

        /// <summary>
        /// Returns the input string with the first character converted to uppercase
        /// </summary>
        public static string ToUpperFirst(this string s)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentException("There is no first letter");

            Span<char> a = stackalloc char[s.Length];
            s.AsSpan(1).CopyTo(a.Slice(1));
            a[0] = char.ToUpper(s[0]);
            return new string(a);
        }

パフォーマンス

|  Method |      Data |      Mean |     Error |    StdDev |
|-------- |---------- |----------:|----------:|----------:|
|  Carlos |       red | 107.29 ns | 2.2401 ns | 3.9234 ns |
|  Darren |       red |  30.93 ns | 0.9228 ns | 0.8632 ns |
| Marcell |       red |  26.99 ns | 0.3902 ns | 0.3459 ns |
|  Carlos | red house | 106.78 ns | 1.9713 ns | 1.8439 ns |
|  Darren | red house |  32.49 ns | 0.4253 ns | 0.3978 ns |
| Marcell | red house |  27.37 ns | 0.3888 ns | 0.3637 ns |

完全なテストコード

using System;
using System.Linq;

using BenchmarkDotNet.Attributes;

namespace CorePerformanceTest
{
    public class StringUpperTest
    {
        [Params("red", "red house")]
        public string Data;

        [Benchmark]
        public string Carlos() => Data.Carlos();

        [Benchmark]
        public string Darren() => Data.Darren();

        [Benchmark]
        public string Marcell() => Data.Marcell();
    }

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

        public static string Darren(this string s)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentException("There is no first letter");

            char[] a = s.ToCharArray();
            a[0] = char.ToUpper(a[0]);
            return new string(a);
        }

        public static string Marcell(this string s)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentException("There is no first letter");

            Span<char> a = stackalloc char[s.Length];
            s.AsSpan(1).CopyTo(a.Slice(1));
            a[0] = char.ToUpper(s[0]);
            return new string(a);
        }
    }

}

編集:s [0]の代わりにtypeoがあり、a [0]がありました-これは、割り当てられたスパンaに同じ空の値をカップリングする結果になります。


0

これにより、この最初の文字とスペースに続くすべての文字が大文字になり、他の文字はすべて小文字になります。

public string CapitalizeFirstLetterAfterSpace(string input)
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder(input);
    bool capitalizeNextLetter = true;
    for(int pos = 0; pos < sb.Length; pos++)
    {
        if(capitalizeNextLetter)
        {
            sb[pos]=System.Char.ToUpper(sb[pos]);
            capitalizeNextLetter = false;
        }
        else
        {
            sb[pos]=System.Char.ToLower(sb[pos]);
        }

        if(sb[pos]=' ')
        {
            capitalizeNextLetter=true;
        }
    }
}

1
または、コードの壁を書きたくない場合-CultureInfo.CurrentCulture.TextInfo.ToTitleCase(theString); 同じことをします。
Chev 2010年

うん...私はそれについて知りませんでした:)そして、私の膨大な量のコードのために、私がまだタイプしている間、他の皆の答えがポップアップしました。
thattolleyguy 2010年

推奨:1)この回答とToTitleCaseのわずかな違いは、この回答はすべて大文字の単語を強制的にTitleCaseにするのに対し、ToTitleCaseはそのような単語をそのままにします(頭字語であると想定)。これが望ましい場合とそうでない場合があります。このようなコード例がある利点は、必要に応じて変更できることです。2)これは ''以外の空白を正しく処理しません。空白のテストを空白のテストに置き換える必要があります。
ToolmakerSteve 2017

0

次のコードを使用します。

string  strtest ="PRASHANT";
strtest.First().ToString().ToUpper() + strtest.Remove(0, 1).ToLower();

数年後に追加されたこの回答に反対票を投じることは私の担当者にとっても意味がありません。それは明らかに既存の回答と同等です。多数の回答が含まれる質問に新しい回答を追加する場合は、回答について優れていると思われるもの、または他の回答よりも役立つ状況について説明してください。具体的に。
ToolmakerSteve 2017

0

ここで与えられた解決策のどれも文字列の前の空白を処理しないようです。

これを考えとして追加するだけです:

public static string SetFirstCharUpper2(string aValue, bool aIgonreLeadingSpaces = true)
{
    if (string.IsNullOrWhiteSpace(aValue))
        return aValue;

    string trimmed = aIgonreLeadingSpaces 
           ? aValue.TrimStart() 
           : aValue;

    return char.ToUpper(trimmed[0]) + trimmed.Substring(1);
}   

それは処理する必要がありますthis won't work on other answers(その文には最初にスペースがあります)。スペースのトリミングが気に入らない場合はfalse、2番目のパラメーターとしてa を渡すだけです(またはデフォルトをfalseに変更して、trueスペースを処理する場合は渡します)。



0

最初の手紙を大文字にする最も簡単な方法は次のとおりです。

1- Sytem.Globalizationの使用。

  // Creates a TextInfo based on the "en-US" culture.
  TextInfo myTI = new CultureInfo("en-US",false).

  myTI.ToTitleCase(textboxname.Text)

`


1
この答えは、本質的に何年も前に与えられた答えと同じです。それは議論に何も追加しません。
ToolmakerSteve 2017

また、他のコメントのように、これはすべての単語の最初の文字をすべて大文字にします。つまり、Red HouseではなくRed Houseです。
DeadlyChambers 2017年

0

次の関数はすべての方法で正しいです。

static string UppercaseWords(string value)
{
    char[] array = value.ToCharArray();
    // Handle the first letter in the string.
    if (array.Length >= 1)
    {
        if (char.IsLower(array[0]))
        {
            array[0] = char.ToUpper(array[0]);
        }
    }
    // Scan through the letters, checking for spaces.
    // ... Uppercase the lowercase letters following spaces.
    for (int i = 1; i < array.Length; i++)
    {
        if (array[i - 1] == ' ')
        {
            if (char.IsLower(array[i]))
            {
                array[i] = char.ToUpper(array[i]);
            }
        }
    }
    return new string(array);
}

ここで見つけ


どうして?似ているように見える回答がすでにたくさんあるのに、なぜさらに別の回答を追加するのですか?既存のすべての回答の何が問題になっていますか?別の回答を追加するように促されましたか?
ToolmakerSteve

このanswareはあらゆる方法で正しいからです。落ち着いて。

ごめんなさい; 私は不必要に苛酷でした。私は事実に固執します:1)これは基本的に7年前のthattolleyguyの回答と同じです。2)これにはその回答と同じ欠陥があります。空白文字以外の空白は処理しません。3)これは、OPが尋ねたのとは少し異なる質問に答えます。すべての単語の最初の文字を大文字にする場合は、このような回答を使用します。4)通常、これを達成する最も簡単な方法は、TitleInfo.ToTitleCaseを使用することです。(一方、コードサンプルの利点は、必要に応じてカスタマイズできることです。)
ToolmakerSteve '12

自分自身を修正する:これは、totolleyguyのアプローチとは異なります。単語の最初の文字ではない手付かずの文字が残ります。代わりに、それはザモルダーの答えの複製です。好都合なことに、ソースへのリンクを提供したことをダリアン称賛します -それは信用を与えることなくザモルダーが盗用されたようです。そのソースリンクを提供し、それによってディスカッションを改善するため、私はこの回答に反対していますが、私の批判にもかかわらずです。
ToolmakerSteve 2017

1
ダリアン、2つの改善が可能:1)のchar.IsWhiteSpace( array[ i -1 ] )代わりに使用して.. == ' '、すべての空白を処理します。2)ある2つの場所を削除しますif (char.isLower(..))-それらは目的を果たしません。ToUpper文字が小文字でない場合は、単に何もしません。
ToolmakerSteve 2017

0

上記のカルロスの質問を拡張して、複数の文を大文字にしたい場合は、次のコードを使用できます。

    /// <summary>
    /// Capitalize first letter of every sentence. 
    /// </summary>
    /// <param name="inputSting"></param>
    /// <returns></returns>
    public string CapitalizeSentences (string inputSting)
    {
        string result = string.Empty;
        if (!string.IsNullOrEmpty(inputSting))
        {
            string[] sentences = inputSting.Split('.');

            foreach (string sentence in sentences)
            {
                result += string.Format ("{0}{1}.", sentence.First().ToString().ToUpper(), sentence.Substring(1)); 
            }
        }

        return result; 
    }

0

問題を解決するための可能な解決策。

   public static string FirstToUpper(this string lowerWord)
   {
       if (string.IsNullOrWhiteSpace(lowerWord) || string.IsNullOrEmpty(lowerWord))
            return lowerWord;
       return new StringBuilder(lowerWord.Substring(0, 1).ToUpper())
                 .Append(lowerWord.Substring(1))
                 .ToString();
   }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.