StringBuilderクラスを使用した文字列の操作方法について紹介します。
StringBuilderクラスを使用すると文字列の操作を高速に処理できる場合があります。
目次
文字列を追加する
文字列を追加するにはAppendメソッドを使用します。
1 2 3 4 5 6 7 |
// 文字列を追加する StringBuilder sb = new StringBuilder(); sb.Append("append1"); sb.Append("append2"); sb.Append("append3"); Console.WriteLine(sb); // → append1append2append3 |
Appendメソッドは追加する文字列の位置を指定して追加することもできます。
1 2 3 4 5 6 7 |
// 位置を指定して文字列を追加する StringBuilder sb = new StringBuilder(); sb.Append("abcde"); // インデックスが3から5文字分(45678)を追加 sb.Append("1234567890", 3, 5); Console.WriteLine(sb); // → abcde45678 |
複合書式指定文字列を処理することで返される文字列を追加する
複合書式指定文字列を指定して文字列を追加するにはAppendFormatメソッドを使用します。
1 2 3 4 5 6 |
// 複合書式指定文字列を処理することで返される文字列を追加する StringBuilder sb = new StringBuilder(); int number = 256; sb.AppendFormat("{0:000000}", number); Console.WriteLine(sb); // → 000256 |
指定した1行の文字列を追加する(文字列の末尾に改行を付加して追加する)
文字列を追加して改行するにはAppendLineメソッドを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 |
// 指定した1行の文字列を追加する StringBuilder sb = new StringBuilder(); sb.AppendLine("line1"); sb.AppendLine("line2"); sb.AppendLine("line3"); Console.WriteLine(sb); /* ↓ line1 line2 line3 */ |
Appendメソッドの引数を省略すると改行のみ追加されます。
1 2 3 4 5 6 7 8 9 10 |
// 改行のみ追加する StringBuilder sb = new StringBuilder(); sb.Append("aaa"); sb.AppendLine(); sb.Append("bbb"); Console.WriteLine(sb); /* ↓ aaa nbbb */ |
メモリに格納できる最大文字数を取得/設定する
メモリに格納できる最大文字数を取得、または設定するにはCapacityプロパティを使用します。
1 2 3 4 5 6 |
// 最大文字数を取得/設定する StringBuilder sb = new StringBuilder(); int capacity = sb.Capacity; // capacity → 16 sb.Capacity = capacity* 2; // capacity → 32 |
クリアする
StringBuilderオブジェクトをクリアするにはClearメソッドを使用します。
1 2 3 4 5 6 7 8 9 10 |
// クリアする StringBuilder sb = new StringBuilder(); sb.Append("abc"); sb.Append("def"); sb.Append("ghi"); Console.WriteLine(sb); // → abcdefghi sb.Clear(); Console.WriteLine(sb); // → 空文字列 |
指定した位置にある文字をChar配列の指定した位置にコピーする
指定した位置(セグメント)にある文字をChar配列の指定した位置(セグメント)にコピーするにはCopyToメソッドを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Char配列にコピーする StringBuilder sb = new StringBuilder("abcdefghijklmno"); char[] destination = new char[13]; destination[0] = 'R'; destination[1] = 'e'; destination[2] = 's'; destination[3] = 'u'; destination[4] = 'l'; destination[5] = 't'; destination[6] = ':'; destination[7] = ' '; sb.CopyTo(0, destination, 8, 5); Console.WriteLine(destination); // → Result: abcde sb.CopyTo(7, destination, 8, 5); Console.WriteLine(destination); // → Result: hijkl |
容量が指定した値以上になるようにする
StringBuilderオブジェクトの容量が指定した値以上になるようにするにはEnsureCapacityメソッドを使用します。
1 2 3 4 5 6 7 |
// 容量が指定した値以上になるようにする StringBuilder sb = new StringBuilder(); Console.WriteLine(sb.Capacity); // → 16 sb.EnsureCapacity(1000); Console.WriteLine(sb.Capacity); // → 1000 |
指定した位置に文字列を挿入する
指定した位置に文字列を挿入するにはInsertメソッドを使用します。
1 2 3 4 5 6 |
// 指定した位置に挿入する StringBuilder sb = new StringBuilder(); sb.Append("1234567890"); sb.Insert(2, "abcde"); Console.WriteLine(sb); // → 12abcde34567890 |
Insertメソッドでは指定した文字位置に指定した回数挿入することもできます。
1 2 3 4 5 6 |
// 指定した位置に指定した回数挿入する StringBuilder sb = new StringBuilder(); sb.Append("1234567890"); sb.Insert(2, "abcde", 3); Console.WriteLine(sb); // → 12abcdeabcdeabcde34567890 |
長さを取得する
StringBuilderオブジェクトの長さを取得するにはLengthプロパティを使用します。
1 2 3 4 5 6 |
// 長さを取得する StringBuilder sb = new StringBuilder(); sb.Append("1234567890"); int length = sb.Length; Console.WriteLine(length); // → 10 |
最大容量を取得する
StringBuilderオブジェクトの最大容量を取得するにはMaxCapacityプロパティを使用します。
1 2 3 4 5 |
// 最大容量を取得する StringBuilder sb = new StringBuilder(); int maxCapacity = sb.MaxCapacity; Console.WriteLine(maxCapacity); // → 2147483647 |
指定した範囲の文字列を削除する
指定した範囲の文字列を削除するにはRemoveメソッドを使用します。
1 2 3 4 5 6 |
// 指定した範囲の文字列を削除する StringBuilder sb = new StringBuilder(); sb.Append("1234567890"); sb.Remove(4, 3); Console.WriteLine(sb); // → 1234890 |
指定した文字列を置換する
指定した文字列を置換するにはReplaceメソッドを使用します。
1 2 3 4 5 6 |
// 指定した文字列を置換する StringBuilder sb = new StringBuilder(); sb.Append("12345 oldValue 67890"); sb.Replace("oldValue", "newValue"); Console.WriteLine(sb); // → 12345 newValue 67890 |
文字列(string)に変換する
文字列(string型のオブジェクト)に変換するにはToStringメソッドを使用します。
1 2 3 4 5 6 7 8 |
// string型に変換する StringBuilder sb = new StringBuilder(); sb.Append("あいうえお"); sb.Append("かきくけこ"); sb.Append("さしすせそ"); string str = sb.ToString(); Console.WriteLine(str); // → あいうえおかきくけこさしすせそ |
サンプルプログラム
Windowsフォームアプリケーションを作成し、StringBuilderと+演算子を使用して文字列を結合するのにかかった時間を表示するサンプルプログラムの実装例を記載します。
ユーザーインターフェース
フォームのインターフェースは次のようにします。
フォームの1段目に結合する文字列を入力するテキストボックス(TextBox)と、結合する回数を指定するテキストボックス(NumericUpDown)を配置します。
フォームの2段目にStringBuilderクラスを使用して文字列を結合するボタン(Buttonと実行結果を表示するテキストボックス(TextBox)を配置します。
フォームの2段目には+演算子を使用して文字列を結合するボタン(Button)と実行結果を表示するテキストボックス(TextBox)を配置します。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
using System; using System.Text; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); textBox1.Text = "abcde"; numericUpDown1.Maximum = 999999999m; numericUpDown1.Value = 100000m; numericUpDown1.TextAlign = HorizontalAlignment.Right; textBox2.ReadOnly = true; textBox2.TextAlign = HorizontalAlignment.Right; textBox3.ReadOnly = true; textBox3.TextAlign = HorizontalAlignment.Right; } // StringBuilderクラスで結合 private void button1_Click(object sender, EventArgs e) { try { string text = textBox1.Text; StringBuilder sb = new StringBuilder(); DateTime start = DateTime.Now; for (int i = 0; i < numericUpDown1.Value; i++) { sb.Append(text); } DateTime end = DateTime.Now; TimeSpan timeSpan = end - start; textBox2.Text = timeSpan.ToString(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } // +演算子で結合 private void button2_Click(object sender, EventArgs e) { try { string text = textBox1.Text; string str = ""; DateTime start = DateTime.Now; for (int i = 0; i < numericUpDown1.Value; i++) { str = str + text; } DateTime end = DateTime.Now; TimeSpan timeSpan = end - start; textBox3.Text = timeSpan.ToString(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
サンプルの実行
作成したプログラムを実行します。
ボタンをクリックするとStringBulderクラスまたは+演算子を使用した文字列の結合処理の実行時間が表示されます。
+演算子を使用した処理よりもStringBulderクラスを使用した処理の方が格段に速いのが分かりました。