1. ホーム 
  2. 備忘録 
  3. C Sharp

文字列結合

文字列結合

単純な文字列同士の結合には主に2つの方法が用いられる

1つは単純に文字列を + 演算子で結合する方法で、もう1つは StringBuilder を用いて結合する方法である

結論から言ってほとんどのケースにおいて StringBuilder を用いるほうが処理速度は速い

例外として結合する文字(変数)が1つや2つ程度であれば気にならない差であることと、結合する文字列に定数しかない(または定数が大半を占めている)時は + 演算子のほうが速い

static void Main( string[] args )
{
    string str1 = "Head ";
    string str2 = "LoopText";
    int loopCount = 10000;
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

    // +演算子による結合
    sw.Restart();
    string res = str1;
    for ( int index = 0; index < loopCount; ++index )
    {
        // ここがメモリ確保を毎回行っている箇所
        // res(新しいメモリ) = res(現在のメモリ) + str2;
        res += str2;
    }
    Console.WriteLine( res );
    sw.Stop();
    Console.WriteLine( sw.Elapsed ); // 00:00:00.1489486

    // StringBuilderによる結合
    sw.Restart();
    StringBuilder sb = new StringBuilder();
    sb.Append( str1 );
    for ( int index = 0; index < loopCount; ++index )
    {
        sb.Append( str2 );
    }
    Console.WriteLine( sb.ToString() );
    sw.Stop();
    Console.WriteLine( sw.Elapsed ); // 00:00:00.0617383
}

コメントで書いてある通り、+演算子による結合は毎回メモリ確保を行っているため、その分メモリ効率や処理速度の面で劣る


特殊な文字列結合

関数 用途
string.Concat 1つ以上の文字列同士を連結する
string.Join 指定した配列の要素またはコレクションのメンバーを連結する
その際、各要素の間に指定した区切り文字を挿入できる
string.Format 指定した書式に基づいて文字列を別の文字列に挿入する
$を使った文字列補間 配列を 昇順/降順 にソートする

string.Concat

string Concat (params string?[] values);
string Concat (params object?[] args);

String の 1 つ以上のインスタンス、または String の 1 つ以上のインスタンスの Object 形式の値を連結する

+ 演算子と異なり一度に全ての文字列を連結するため、効率性は高い(ただし StringBuilder よりは遅い)

StringBuilder のインスタンス化にもコストがかかるので、少量の文字列連結ぐらいならConcatのほうが良いかも?(未検証)

values / args
string または object 型の可変長引数
連結したい文字列インスタンス
戻り値
連結された values の要素
// 配列のまま渡す
string[] s = { "hello ", "and ", "welcome ", "to ", "this ", "demo! " };
Console.WriteLine( string.Concat( s ) );

// 文字列を一つずつわたす
Console.WriteLine( string.Concat( "hello ", "and ", "welcome ", "to ", "this ", "demo! "  ) );

string.Join

string Join (string? separator, params object?[] values);
string Join (string? separator, params string?[] values);

String の 1 つ以上のインスタンス、または String の 1 つ以上のインスタンスの Object 形式の値を連結する

+ 演算子と異なり一度に全ての文字列を連結するため、効率性は高い(ただし StringBuilder よりは遅い)

StringBuilder のインスタンス化にもコストがかかるので、少量の文字列連結ぐらいならConcatのほうが良いかも?(未検証)

separator
区切り記号として使用する文字列
value が 2 つ以上の要素を含む場合のみ、separator が返される文字列に含まれる
value
連結する要素を格納している配列
戻り値
value 内の要素からなる、separator 文字列で区切られた文字列

string.Format

string Format (string format, params object?[] args);

指定された形式に基づいてオブジェクトの値を文字列に変換し、別の文字列に挿入する

format
複合書式設定文字列
args
0 個以上の書式設定対象オブジェクトを含んだオブジェクト配列
戻り値
書式項目が args の対応するオブジェクトの文字列表記に置換された format のコピー
// 挿入したい文字列
string prefecture = "福岡県";
float temperature = 27.8f;

// フォーマット指定して挿入
String s = String.Format( "本日の{0}の最高気温は{1}℃です", prefecture, temperature );
Console.WriteLine( s ); // 本日の福岡県の最高気温は27.8℃です

$を使った文字列補間

C#6.0以降、文字列の先頭に $ の記号を追加することで文字列リテラルを挿入文字列として認識するようになった

{}内に変数を指定できるため、より書きやすく、直観的になった

// 挿入したい文字列
string prefecture = "大阪府";
float temperature = 25.2f;

// 文字列補間を使用する
String s = $"本日の{prefecture}の最高気温は{temperature}℃です";
Console.WriteLine( s ); // 本日の大阪府の最高気温は25.2℃です

    参考文献

  1. C#における最速の文字列結合を検証する
  2. C#で一度に複数の文字列を結合した時の処理時間を計測する