.NET TIPS

StringBuilderオブジェクトの文字列をクリアするには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2009/02/26

 「TIPS:文字列を連結するには?」で解説しているように、StringBuilderクラス(System.Text名前空間)を使うと複数の文字列の連結を高速に行うことができる。

 また、StringBuilderクラスには、Appendメソッド(文字列の追加)以外にも、Insertメソッド(挿入)やRemoveメソッド(削除)などが用意されており、あたかも文字のコレクション(集合)として、その文字列を操作できる。

 しかし、コレクション系のクラス(例えばListジェネリック・クラス)にはたいてい存在する、コレクション内の要素をすべて削除するClearメソッドに相当するメソッドは、StringBuilderクラスには存在しない。StringBuilderオブジェクト内の文字列をクリアするにはどうすればよいのだろうか。

書き込み可能なStringBuilderクラスのLengthプロパティ

 StringBuilderクラスにはClearメソッドは存在しないが、プロパティ一覧をよく見ると、StringBuilderオブジェクトが保持する文字列の長さを返すLengthプロパティが読み取り専用ではないことが分かる。つまり、このLengthプロパティに値を設定して現在の文字列の長さを変更することが可能で、これに「0」を設定することにより、StringBuilderオブジェクトの文字列をクリアすることができる。

 次のコードはこれを行っている例だ。このプログラムでは、ある巨大な表(テーブル)の各セルの値(文字列)を、行ごとに1つの文字列に連結するという処理を想定している。

using System;
using System.Text;

class Program {
  static void Main() {

    string[][] bigtable = new string[][] {
      new string[] {"1", "a", "あ"},
      new string[] {"2", "b", "い"},
      new string[] {"3", "c", "う"},
      new string[] {"4", "d", "え"},
    };

    StringBuilder sb = new StringBuilder(); // インスタンス作成

    foreach (string[] row in bigtable) { // 表の各行に対して
      foreach (string s in row) { // 行の各セルに対して
        sb.Append(s);
      }
      Console.WriteLine(sb);
      sb.Length = 0; // StringBuilderのクリア
    }
  }
}
Imports System
Imports System.Text

Class Program
  Shared Sub Main()

    Dim bigtable As String()() = New String()() { _
     New String() {"1", "a", "あ"}, _
     New String() {"2", "b", "い"}, _
     New String() {"3", "c", "う"}, _
     New String() {"4", "d", "え"}}

    Dim builder As New StringBuilder() ' インスタンス作成

    For Each row As String() In bigtable ' 表の各行に対して
      For Each s As String In row ' 行の各セルに対して
        builder.Append(s)
      Next
      Console.WriteLine(builder)
      builder.Length = 0 ' StringBuilderのクリア
    Next
  End Sub
End Class
Lengthプロパティによるクリア(上:C#、下:VB)

 この例では、最初にStringBuilderクラスのインスタンスを1つ作成し、随時その内容をクリアしながら処理を行っている。

 もちろんクリアなどせずに、次のコードのように、ループ内で毎回StringBuilderクラスのインスタンスを新規作成しても特に問題はない。

using System;
using System.Text;

class Program {
  static void Main() {

    string[][] bigtable = new string[][] {
      new string[] {"1", "a", "あ"},
      new string[] {"2", "b", "い"},
      new string[] {"3", "c", "う"},
      new string[] {"4", "d", "え"},
    };

    foreach (string[] row in bigtable) {

      StringBuilder sb = new StringBuilder(); // 毎回新規作成

      foreach (string s in row) {
        sb.Append(s);
      }
      Console.WriteLine(sb);
    }
  }
}
Imports System
Imports System.Text

Class Program
  Shared Sub Main()

    Dim bigtable As String()() = New String()() { _
     New String() {"1", "a", "あ"}, _
     New String() {"2", "b", "い"}, _
     New String() {"3", "c", "う"}, _
     New String() {"4", "d", "え"}}

    For Each row As String() In bigtable

      Dim builder As New StringBuilder() ' 毎回新規作成

      For Each s As String In row
        builder.Append(s)
      Next
      Console.WriteLine(builder)
    Next
  End Sub
End Class
インスタンスの再作成(上:C#、下:VB)

 毎回インスタンスを作成する方がオーバーヘッドは若干大きいと思われるが、現在のPCの性能を考えると大した問題ではないだろう。End of Article

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:StringBuilderクラス(System.Text名前空間)
関連TIPS:文字列を連結するには?

この記事と関連性の高い別の.NET TIPS
StringBuilderオブジェクトの文字列を簡単にクリアするには?
文字列を連結するには?
文字列の長さを取得するには?
文字列から特定の文字列を取り除くには?
1つのキー文字列に対して複数の文字列値を保持するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間