|   | 
 
|  
 .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の性能を考えると大した問題ではないだろう。
 
カテゴリ:クラス・ライブラリ 処理対象:文字列 
使用ライブラリ:StringBuilderクラス(System.Text名前空間) 
関連TIPS:文字列を連結するには? | 
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間