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#を使ううえで覚えておくと、とても役立つ知識です。