文字列結合
文字列結合 ▲
単純な文字列同士の結合には主に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℃です
目次