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クラスのメソッドを使うと処理時間が短くて済みます。
使いこなすことができるように、この記事を何度も参考にして下さいね!