【C#入門】StringBuilderクラスで文字列を追加、挿入、削除、置換

StringBuilderクラスって使ってますか?

StringBuilderクラスを使うと、文字列を追加、挿入したり削除、置換することができます。

この記事では、StringBuilderクラスについて

  • StringBuilderクラスとは
  • Appendで文字列を追加
  • AppendFormatで書式を指定して追加
  • Insertで文字列を挿入
  • Removeで文字列を削除
  • Replaceで文字列を置換
  • Appendで文字連結の高速化

など基本的な内容から、応用的な使い方の内容についても解説していきます。

今回はStringBuilderクラスについて、使い方をわかりやすく解説します!

目次

StringBuilderクラスとは

StringBuilderクラスは文字列に変更を加えたい場合に使います。c#で文字列を変更する場合、新しくメモリを確保する必要があります。

文字列を何度も変更する必要がある場合にStringBuilderクラスを使えば、繰り返しメモリを確保せずに済みます。

StringBuilderクラスはSystem.Text名前空間から呼び出します。StringBuilderクラスはnew演算子を使ってインスタンスを生成し、StringBuilderクラスのオブジェクトに格納して使います。

StringBuilderクラスのオブジェクトから以下のメソッドを呼び出すことができます。

メソッド名説明
Append末尾に文字列を追加
AppendFormat書式を設定して文字列を追加
Insert指定したインデックス番号に文字列を挿入
Remove指定した文字数を削除
Replace指定したインデックス番号で、指定した文字を置換

それでは、それぞれのメソッドの使い方について詳しくみていきましょう。

Appendで文字列を追加

Appendメソッドの使って、末尾に文字列を追加します。

using System;
using System.Text;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      StringBuilder sb = new StringBuilder("侍");
      Console.WriteLine(sb.Append("エンジニア塾"));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍エンジニア

このサンプルコードでは、StringBuilderクラスのオブジェクトsbからAppendメソッドを呼び出し、文字列を結合しています。

AppendFormatで書式を指定して追加

先ほどはAppendメソッドを使って、文字列を末尾に追加する方法についてお伝えしました。

数値や日付を文字列に変換して追加する場合はAppendFormatメソッドを使って書式を指定します。

using System;
using System.Text;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      StringBuilder sb = new StringBuilder("平成");
      int num = 30;
      
      Console.WriteLine(sb.AppendFormat("{0}年は{1}年です", num, num + 1988));
      
      Console.ReadKey();
    }
  }
}

実行結果:

平成30年は2018年です

このサンプルコードでは、AppendFormatメソッドを使って数値と数式を文字列に変換して文字列を追加しています。

書式を指定する方法については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

Insertで文字列を挿入

末尾ではなく、文字列の中に追加するにはInsertメソッドを使います。

Insertメソッドでは第1引数で挿入位置のインデックス番号を指定し、第2引数で挿入する文字列を指定します。

第1引数のインデックス番号は0から始まります。

using System;
using System.Text;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      StringBuilder sb = new StringBuilder("侍塾");
      string str = "エンジニア";
      
      Console.WriteLine(sb.Insert(1, str));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍エンジニア

Removeで文字列を削除

文字列の一部を削除したい場合は、Removeメソッドを使います。

Removeメソッドの第1引数で削除する文字列の開始位置をインデックス番号で指定し、第2引数で削除する文字数を指定します。

using System;
using System.Text;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      StringBuilder sb = new StringBuilder("侍エンジニアengineer塾");
      Console.WriteLine(sb.Remove(6, 8));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍エンジニア

Replaceで文字列を置換

文字列の一部を別の文字列で置き換えたい場合は、Replaceメソッドを使います。

Replaceメソッドの第1引数には置き換えられる文字列を指定し、第2引数には置き換えたあとの文字列を指定します。

using System;
using System.Text;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      StringBuilder sb = new StringBuilder("侍engineer塾");
      string str = "エンジニア";
      
      Console.WriteLine(sb.Replace("engineer", str));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍エンジニア

ReplaceメソッドはStringクラスにもあります。

StringクラスのReplaceメソッドの使い方はこちらの記事で詳しく解説しているので、興味のある方はぜひ確認してください。

Appendで文字連結の高速化

ここまではStringBuilderクラスのメソッドの使い方についてお伝えしてきました。

StringBuilderクラスを使うと、文字列を変更するたびにメモリを確保する必要はありません。ですので、たくさんの文字列を変更する場合、変更の度にメモリの確保で余計な処理時間を取られることなく高速で処理できます。

これに対して、例えば「+」記号で文字列を連結する場合は連結の度にメモリを確保しますので、処理に時間がかかると言われています。

ここでは、たくさんの文字列を結合する場合にStringBuilder.Appendメソッド、「+」、String.Formatメソッド、String.Joinメソッドで処理時間を比較しまてみましょう。

ちなみに、String.Joinメソッドはstring型の配列の要素を全て連結する場合に使います。

using System;
using System.Text;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "";
      long num = 100000;
      int t = 0;
      
      // 「+」で連結
      t = System.Environment.TickCount;
      for(int i = 0; i < num; i++) {
        str += "ABCDE";
      }
      t = System.Environment.TickCount - t;
      Console.WriteLine("「+」では、{0}ミリ秒", t);
      
      // StringBuilder.Appendで連結
      str = "";
      t = System.Environment.TickCount;
      StringBuilder sb = new StringBuilder();
      for(int i = 0; i < num; i++) {
        sb.Append("ABCDE");
      }
      str = sb.ToString();
      t = System.Environment.TickCount - t;
      Console.WriteLine("StringBuilder.Appendでは、{0}ミリ秒", t);
      
      // String.Formatで連結
      str = "";
      t = System.Environment.TickCount;
      for(int i = 0; i < num; i++) {
        String.Format("{0}{1}", str, "ABCDE");
      }
      t = System.Environment.TickCount - t;
      Console.WriteLine("String.Formatでは、{0}ミリ秒", t);
      
      // String.Joinで連結
      str = "";
      t = System.Environment.TickCount;
      string[] src = new string[num];
      for(int i = 0; i < num; i++) {
        src[i] = "ABCDE";
      }
      str = String.Join("", src);
      t = System.Environment.TickCount - t;
      Console.WriteLine("String.Joinでは、{0}ミリ秒", t);
      
      Console.ReadKey();
    }
  }
}

実行結果:

「+」では、58180ミリ秒
StringBuilder.Appendでは、5ミリ秒
String.Formatでは、22ミリ秒
String.Joinでは、5ミリ秒

このサンプルコードでは、「+」記号、StringBuilder.Appendメソッド、String.Formatメソッド、String.Joinメソッドを使って文字列”ABCDE”を10万個結合する時間を比較しています。

結果はStringBuilder.AppendメソッドとString.Joinメソッドが5ミリ秒と速く、「+」記号が約58,000ミリ秒と極端に遅い結果となりました。

約1万倍の差があります。これは「+」記号が結合する度にメモリを確保しているので時間がかかっています。

これに対して、StringBuilder.AppendメソッドやString.Joinメソッドはあらかじめメモリを確保しているので時間を必要としません。

たくさんの文字を操作する必要がある場合は、StringBuilderクラスのメソッドを使うようにしましょう!

文字列の使い方総まとめ

文字列の様々な使い方は次の記事でまとめて解説しているので、その他の文字列の使い方に興味がある方はぜひ確認してください。

まとめ

ここでは、StringBuilderクラスについて説明しました。

文字列をたくさんの回数変更処理する場合は、StringBuilderクラスのメソッドを使うと処理時間が短くて済みます。

使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次