C#の文字列を繰り返し結合する方法(StringBuilderの活用)
生徒
「先生、C#でたくさんの文字列を繰り返し結合したいんですが、どうやってやるのが良いんですか?」
先生
「とても良い質問ですね。C#で文字列を何度も結合するときは、StringBuilderというクラスを使うのが便利ですよ。」
生徒
「StringBuilderですか? 文字列を結合するなら、普通に+でつなげればいいんじゃないんですか?」
先生
「たしかに少ない回数ならそれでも問題ありません。でも、大量の文字列を繰り返し結合する場合は、StringBuilderを使うほうが圧倒的に速くて効率が良いんです。」
生徒
「なるほど…!どんなふうに使うのか、実際のコードで見せてもらえますか?」
先生
「もちろん!それでは、StringBuilderを使った文字列結合の基本から学んでいきましょう。」
1. C#で文字列を結合する基本
C#では、文字列をつなげるときに「文字列結合」という操作を行います。たとえば、「こんにちは」と「世界」を結合して「こんにちは世界」としたいとき、単純に+記号を使って書くことができます。
string message = "こんにちは" + "世界";
Console.WriteLine(message);
こんにちは世界
このように、文字列を少しだけ結合する場合は+で十分です。しかし、ループ(繰り返し処理)の中で何百回・何千回も結合を行うと、処理速度が遅くなってしまうのです。
2. 文字列結合が遅くなる理由とは?
文字列(string)は不変(immutable)オブジェクトです。これは、一度作られた文字列の内容は変更できないという意味です。たとえば、次のようなコードを考えてみましょう。
string text = "";
for (int i = 0; i < 5; i++)
{
text = text + i;
}
Console.WriteLine(text);
01234
このコードでは、毎回text + iのたびに新しい文字列を作り直しているため、処理が重くなります。たった5回なら問題ありませんが、1万回・10万回になると、パソコンの動作が遅くなったり、メモリを無駄に使ったりしてしまいます。
3. StringBuilderを使って効率的に文字列を結合しよう
ここで登場するのが、StringBuilder(ストリングビルダー)クラスです。これは、文字列を扱うための便利なクラスで、繰り返し結合しても高速に動作します。使い方はとても簡単です。
using System.Text; // StringBuilderを使うために必要
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++)
{
sb.Append(i); // 文字列を追加
}
Console.WriteLine(sb.ToString()); // まとめて出力
01234
Appendメソッドは、「追加する」という意味です。この方法なら、何回繰り返しても新しい文字列を毎回作り直さないので、処理が非常に高速になります。
4. StringBuilderと通常の結合の速度の違い
実際に速度を比べてみると、差は歴然です。たとえば、10万回文字列を結合する場合を想定してみましょう。
using System;
using System.Diagnostics;
using System.Text;
class Program
{
static void Main()
{
Stopwatch sw = new Stopwatch();
// 通常の文字列結合
sw.Start();
string text = "";
for (int i = 0; i < 100000; i++)
{
text += "a";
}
sw.Stop();
Console.WriteLine("通常の結合: " + sw.ElapsedMilliseconds + "ms");
// StringBuilderでの結合
sw.Restart();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++)
{
sb.Append("a");
}
sw.Stop();
Console.WriteLine("StringBuilder: " + sw.ElapsedMilliseconds + "ms");
}
}
このように実行すると、StringBuilderのほうが圧倒的に早いことがわかります。特に大量の文字列を扱うアプリケーションでは、StringBuilderを使うのが必須といえるでしょう。
5. StringBuilderの便利なメソッド
StringBuilderには、文字列を扱うための便利なメソッドがたくさんあります。ここではよく使う3つを紹介します。
Append(string value):文字列を追加します。AppendLine(string value):文字列を追加して改行します。Clear():中身をすべて削除します。
次の例では、AppendLineとClearを使ってみましょう。
using System.Text;
StringBuilder sb = new StringBuilder();
sb.AppendLine("1行目");
sb.AppendLine("2行目");
sb.AppendLine("3行目");
Console.WriteLine(sb.ToString()); // 中身を表示
sb.Clear(); // 内容をリセット
sb.Append("再利用できます!");
Console.WriteLine(sb.ToString());
1行目
2行目
3行目
再利用できます!
このように、StringBuilderは一度作っても再利用ができるため、メモリの無駄が少なく効率的に文字列を扱うことができます。
6. どんなときにStringBuilderを使うべき?
StringBuilderを使うタイミングの目安は、以下のようなケースです。
- ループで文字列を何度も追加・結合するとき
- ログのように長いテキストをまとめて作るとき
- パフォーマンス(処理速度)を重視したいとき
逆に、短い文字列を数回だけ結合する程度なら、+でつなげても問題ありません。使い分けが大切です。
実際の開発現場でも、ループの中で文字列を扱う処理がある場合は、ほぼ必ずStringBuilderが使われています。C#を使ううえで覚えておくと、とても役立つ知識です。
まとめ
C#で文字列を繰り返し結合する場面は、初心者から上級者まで幅広いプログラマーが日常的に直面する処理のひとつです。短いメッセージをつなげるだけなら+演算子で問題ありませんが、繰り返し回数が増えると文字列が作り直され続けるため、処理は徐々に重くなります。これは、文字列が「不変(immutable)」であるという性質により、一度作られた文字列は変更できず、結合するたびに新しい領域が作られるからです。今回の記事では、その問題を解決する方法として登場したStringBuilderの特徴やメリットを詳しく学びました。
StringBuilderは、効率よく文字列の追加や結合を行うために作られたクラスで、Appendを使って内容を追加し、最後にToString()でまとめて文字列に変換する仕組みになっています。そのため、大量の文字列結合を行う場合でも高速に動作し、メモリの無駄も抑えられるという大きな利点があります。特に、ログの生成や大量データの加工、テキスト処理が必要なシステムなどでは欠かせない存在です。また、AppendLineで改行付きの追加ができることや、Clear()で内容をリセットして再利用できる点も、大量データを扱う際の強力な味方となります。
実際には、ループ回数が少ない場合や簡単な結合であれば+でも問題ありません。しかし、プログラムが大規模になるほど文字列操作の効率は大きな差となって現れます。今回の学習内容を踏まえることで、場面ごとに最適な方法を選ぶ力が身につき、C#の文字列操作がより滑らかで安定したものになるでしょう。特に処理速度が重要なアプリケーションを作る場合は、StringBuilderを積極的に活用することで、品質の高いコードを実現できます。
サンプルプログラムでStringBuilderをさらに活用する
ここでは、より実践的なStringBuilderの使い方として、「複数行のメッセージを生成し、最後にまとめて文字列に変換する」例を紹介します。ログ生成などの場面で非常に便利です。
using System;
using System.Text;
class LogBuilder
{
static void Main()
{
StringBuilder log = new StringBuilder();
for (int i = 1; i <= 5; i++)
{
log.AppendLine($"処理{i}回目が完了しました");
}
log.AppendLine("すべての処理が終了しました。");
string result = log.ToString();
Console.WriteLine(result);
log.Clear();
log.Append("ログを初期化して再利用しています。");
Console.WriteLine(log.ToString());
}
}
この例では、AppendLineを使って複数行のテキストを蓄積し、必要なタイミングで出力できるようになっています。最後にClear()を呼び出すことでログを初期化し、新しいメッセージに再利用できる点も、メモリ効率を高めるポイントです。こうした積み重ねにより、アプリケーション全体の処理速度や安定性が向上します。
生徒「StringBuilderって、こんなに便利だったんですね。なんとなく+でつなげていましたけど、繰り返すと重くなる理由がよく分かりました。」
先生「そうでしょう?特にループの中で何度も結合すると、毎回別の文字列が作られてしまって効率が悪くなるんです。StringBuilderならその心配がありません。」
生徒「AppendLineで簡単に改行を追加できたり、Clearで再利用できたりするのも魅力ですね。ログを作るときに使えそうです。」
先生「その通りです。大量のテキスト処理やログ作成のような場面では欠かせない存在ですし、覚えておくと開発の幅がさらに広がりますよ。」
生徒「これからは結合の回数が多くなりそうなコードには、迷わずStringBuilderを使うようにします!」
先生「とても良い判断です。状況に合わせて使い分ける力が身につけば、より質の高いC#コードを書けるようになりますよ。」