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

【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();
    }
  }
}

実行結果:

侍エンジニア塾

Appendで文字連結の高速化

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

Substringメソッドを使うと、文字列を変更するたびにメモリを確保する必要はありません

ですので、たくさんの文字列を変更する場合、変更の度にメモリの確保で余計な処理時間を取られることなく高速で処理できます。

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

ここでは、たくさんの文字列を結合する場合に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クラスのメソッドを使うと処理時間が短くて済みます

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

33歳、未経験だった僕がフリーエンジニアになれた理由

現在フリーでWEBエンジニアをやられている濱口直行さん。33歳で、プログラミングを学び始め、約半年という短い期間で独立までされた学習ログを余すことなくインタビューさせていただきました。

プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。

現役フリーランスエンジニアによる無料体験レッスン実施中!

もし、あなたが、

  • 経験、年齢、学歴に不安がある
  • 挫折しない学習方法が知りたい
  • アプリ開発で困っている
  • エンジニアの”生”の声が聞きたい!
  • 仕事獲得の仕方がわからない
  • エンジニアに転職したいが何をすればいいかわからない

など、プログラミング学習やキャリアのことでお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_mtm3

学習者インタビュー

23歳、早稲田中退生が3ヶ月でフリーランスエンジニアになるまで
元ベンチャー役員が起業のためにプログラミングを学んだ本当の理由
売上2,000万のサービスを作った僕がプログラミング学習をした理由
IT音痴のヨガインストラクターが爆速でサイト作成できた秘訣
Rubyを学んだ島根女子流の仕事術「PCとWifiさえあれば仕事はできる」
文系こそなるべき!経験ゼロから3ヶ月でエンジニアに転身した経済学部出身の話

人気記事セレクション

WEBアプリって?ゼロから始める5ステップ
自分にぴったりのプログラミング言語を知る
完全無料!プログラミング学習サイトTop5
プログラミング案件サクッと取れるサイト集
未経験でフリーエンジニアになれる5つの理由
WEBアプリ開発言語を選ぶべき3つの理由
Pythonって何ができるの!?徹底解説!
プログラミング初心者が急成長する10の秘訣
挫折知らず!ドットインストール200%活用術

プログラミング学習者必見

専属講師に質問し放題、レッスンし放題!最短1ヶ月でフリーランスエンジニア
プログラミング学習カリキュラム無料公開中
Ruby学習カリキュラム無料公開中
Python学習カリキュラム無料公開中
 1記事最大11,000円!テックライター募集


Source: 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

プログラムはじめの一歩カテゴリの最新記事