StringBuilder StringBuilder StringBuilder StringBuilder Class

定義

可変型の文字列を表します。 このクラスは継承できません。

public ref class StringBuilder sealed : System::Runtime::Serialization::ISerializable
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public sealed class StringBuilder : System.Runtime.Serialization.ISerializable
type StringBuilder = class
    interface ISerializable
Public NotInheritable Class StringBuilder
Implements ISerializable
継承
StringBuilderStringBuilderStringBuilderStringBuilder
属性
実装

次の例で定義されたメソッドの多くを呼び出す方法を示しています、StringBuilderクラス。

using namespace System;
using namespace System::Text;

int main()
{
    // Create a StringBuilder that expects to hold 50 characters.
    // Initialize the StringBuilder with "ABC".
    StringBuilder^ sb = gcnew StringBuilder("ABC", 50);

    // Append three characters (D, E, and F) to the end of the
    // StringBuilder.
    sb->Append(gcnew array<Char>{'D', 'E', 'F'});

    // Append a format string to the end of the StringBuilder.
    sb->AppendFormat("GHI{0}{1}", (Char)'J', (Char)'k');

    // Display the number of characters in the StringBuilder
    // and its string.
    Console::WriteLine("{0} chars: {1}", sb->Length, sb->ToString());

    // Insert a string at the beginning of the StringBuilder.
    sb->Insert(0, "Alphabet: ");

    // Replace all lowercase k's with uppercase K's.
    sb->Replace('k', 'K');

    // Display the number of characters in the StringBuilder
    // and its string.
    Console::WriteLine("{0} chars: {1}", sb->Length, sb->ToString());
}

// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK
using System;
using System.Text;

public sealed class App 
{
    static void Main() 
    {
        // Create a StringBuilder that expects to hold 50 characters.
        // Initialize the StringBuilder with "ABC".
        StringBuilder sb = new StringBuilder("ABC", 50);

        // Append three characters (D, E, and F) to the end of the StringBuilder.
        sb.Append(new char[] { 'D', 'E', 'F' });

        // Append a format string to the end of the StringBuilder.
        sb.AppendFormat("GHI{0}{1}", 'J', 'k');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());

        // Insert a string at the beginning of the StringBuilder.
        sb.Insert(0, "Alphabet: ");

        // Replace all lowercase k's with uppercase K's.
        sb.Replace('k', 'K');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
    }
}

// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK
Imports System.Text

Public Module App 
    Public Sub Main() 
        ' Create a StringBuilder that expects to hold 50 characters.
        ' Initialize the StringBuilder with "ABC".
        Dim sb As New StringBuilder("ABC", 50)

        ' Append three characters (D, E, and F) to the end of the StringBuilder.
        sb.Append(New Char() {"D"c, "E"c, "F"c})

        ' Append a format string to the end of the StringBuilder.
        sb.AppendFormat("GHI{0}{1}", "J"c, "k"c)

        ' Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString())

        ' Insert a string at the beginning of the StringBuilder.
        sb.Insert(0, "Alphabet: ")

        ' Replace all lowercase k's with uppercase K's.
        sb.Replace("k", "K")

        ' Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString())
    End Sub
End Module

' This code produces the following output.
'
' 11 chars: ABCDEFGHIJk
' 21 chars: Alphabet: ABCDEFGHIJK

注釈

このクラスは、値が変更可能な一連の文字の文字列のようなオブジェクトを表します。

このセクションの内容:

文字列と StringBuilder 型

StringBuilderStringシーケンスを表す両方の文字の実装は異なります。 String 変更不可の型です。 変更に表示される各操作をStringオブジェクトが実際に新しい文字列を作成します。

呼び出しなど、String.Concatという名前の文字列変数の値を変更する次の c# の例のメソッドが表示されますvalueします。 実際には、Concatメソッドを返します。 をvalueオブジェクト別の値とからのアドレスを持つ、valueメソッドに渡されたオブジェクト。 使用して、例をコンパイルする必要がありますに注意してください、/unsafeコンパイラ オプション。

using System;

public class Example
{
   public unsafe static void Main()
   {
      string value = "This is the first sentence" + ".";
      fixed (char* start = value)
      {
         value = String.Concat(value, "This is the second sentence. ");
         fixed (char* current = value)
         {
            Console.WriteLine(start == current);
         }
      }   
   }
}
// The example displays the following output:
//      False

(ループ内で何度も文字列を変更するアプリ) などの広範な文字列操作を実行するルーチンの場合、繰り返しの文字列を変更することが、大幅なパフォーマンスの低下に正確なことができます。 使用する方法がStringBuilder文字列の変更可能なクラスです。 可変性では、クラスのインスタンスが作成されたら、それを変更できることによって追加、削除、置換、または文字を挿入することを意味します。 AStringBuilderオブジェクトは、文字列の拡張に対応するためにバッファーを保持します。 ルームがある場合、新しいデータがバッファーに追加されます。それ以外の場合、新しいより大きなバッファーを割り当て、元のバッファーからのデータは、新しいバッファーにコピーおよび、次に、新しいデータは新しいバッファーに追加します。

重要

ですが、StringBuilderクラスが通常よりも優れたパフォーマンスを提供、Stringクラスを自動的に代わり使用しないでくださいStringStringBuilder文字列を操作するたびにします。 パフォーマンスは、新しい文字列、アプリが実行されて、システムおよび操作の種類に割り当てられるメモリの量、文字列のサイズによって異なります。 判断するアプリをテストする準備しておくべきかどうかStringBuilder実際に大幅なパフォーマンスの向上を提供します。

使用を検討して、Stringこれらの条件下でクラス。

  • 文字列に、アプリが加えた変更の数が小さい場合です。 このような場合は、StringBuilderがごくわずかのプランまたは経由でパフォーマンスが向上しないStringします。

  • ときに固定数のリテラル文字列で特に、連結演算を実行しています。 この場合、コンパイラは、1 回の操作に連結演算を組み合わせることがあります。

  • ある場合、文字列を構築しているときに、広範な検索操作を実行します。 StringBuilderクラスにメソッドをなど、検索するIndexOfまたはStartsWithします。 変換する必要があります、StringBuilderオブジェクトをStringを使用してから、パフォーマンス上の利点を無効にでき、これらの操作のStringBuilderします。 詳細については、次を参照してください。、 StringBuilder オブジェクトのテキストを検索セクション。

使用を検討して、StringBuilderこれらの条件下でクラス。

  • (たとえば、ユーザー入力を格納する文字列のランダムな数値を連結するループを使用している場合) のデザイン時に文字列を変更数が不明なするアプリを予期したタイミング。

  • 文字列を多数の変更を有効にするアプリを予期したタイミング。

StringBuilder のしくみ

StringBuilder.Lengthプロパティの文字数を示します、StringBuilderオブジェクトに現在含まれています。 文字を追加する場合、StringBuilderオブジェクト、その長さが増加のサイズが等しくなるまで、StringBuilder.Capacityプロパティで、オブジェクトに格納できる文字数を定義します。 追加された文字の数の長さが発生した場合、StringBuilderをその現在の容量のほか、新しいメモリを超えるオブジェクトは、割り当て済みの値、Capacityプロパティが 2 倍に新しい文字が追加、StringBuilderオブジェクト、およびそのLengthプロパティを調整します。 追加のメモリをStringBuilderによって定義された値に達するまで、オブジェクトが動的に割り当てられます、StringBuilder.MaxCapacityプロパティ。 最大容量に達すると、さらにメモリの割り当て可能なし、StringBuilderオブジェクト、および文字を追加または最大容量を超えて展開しようとしています。 いずれかをスローします。、ArgumentOutOfRangeExceptionまたはOutOfMemoryException例外。

次の例を示して 方法、StringBuilder新しいメモリを割り当ておよびオブジェクトに割り当てられた文字列の拡張に伴い、その容量を動的に増加します。 コードを作成、StringBuilder既定 (パラメーターなしの) コンス トラクターを呼び出してオブジェクト。 このオブジェクトの既定の容量が 16 文字、およびその最大容量が 20億を超える文字。 文字列を追加する、"This is 文です"。 新しいメモリ割り当ての結果文字列の長さ (19 文字)、既定の容量を超えているため、StringBuilderオブジェクト。 32 文字以内に、オブジェクトの容量が 2 倍に、新しい文字列を追加すると、およびオブジェクトの長さは 19 文字を今すぐと等しい。 コード、文字列を追加「これは、追加の文です」。 値に、 StringBuilder 11 回のオブジェクトします。 追加操作がの長さを発生するたびに、StringBuilderをその容量はその既存の容量を超えるオブジェクトが 2 倍とAppend操作が成功しました。

using System;
using System.Reflection;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder();
      ShowSBInfo(sb);
      sb.Append("This is a sentence.");
      ShowSBInfo(sb);
      for (int ctr = 0; ctr <= 10; ctr++) {
         sb.Append("This is an additional sentence.");
         ShowSBInfo(sb);
      }   
   }
   
   private static void ShowSBInfo(StringBuilder sb)
   {
      foreach (var prop in sb.GetType().GetProperties()) {
         if (prop.GetIndexParameters().Length == 0)
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb));
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    Capacity: 16    MaxCapacity: 2,147,483,647    Length: 0
//    Capacity: 32    MaxCapacity: 2,147,483,647    Length: 19
//    Capacity: 64    MaxCapacity: 2,147,483,647    Length: 50
//    Capacity: 128    MaxCapacity: 2,147,483,647    Length: 81
//    Capacity: 128    MaxCapacity: 2,147,483,647    Length: 112
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 143
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 174
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 205
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 236
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 267
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 298
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 329
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 360
Imports System.Reflection
Imports System.Text

Module Example
   Public Sub Main()
      Dim sb As New StringBuilder()
      ShowSBInfo(sb)
      sb.Append("This is a sentence.")
      ShowSbInfo(sb)
      For ctr As Integer = 0 To 10
         sb.Append("This is an additional sentence.")
         ShowSbInfo(sb)
      Next   
   End Sub
   
   Public Sub ShowSBInfo(sb As StringBuilder)
      For Each prop In sb.GetType().GetProperties
         If prop.GetIndexParameters().Length = 0 Then
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb))
         End If   
      Next
      Console.WriteLine()
   End Sub
End Module
' The example displays the following output:
'    Capacity: 16    MaxCapacity: 2,147,483,647    Length: 0
'    Capacity: 32    MaxCapacity: 2,147,483,647    Length: 19
'    Capacity: 64    MaxCapacity: 2,147,483,647    Length: 50
'    Capacity: 128    MaxCapacity: 2,147,483,647    Length: 81
'    Capacity: 128    MaxCapacity: 2,147,483,647    Length: 112
'    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 143
'    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 174
'    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 205
'    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 236
'    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 267
'    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 298
'    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 329
'    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 360

メモリの割り当て

既定の容量をStringBuilderオブジェクトは、16 文字とその既定の最大容量はInt32.MaxValueします。 呼び出す場合、これらの既定値が使用される、StringBuilder()StringBuilder(String)コンス トラクター。

初期量を明示的に定義することができます、StringBuilder次の方法でオブジェクト。

  • いずれかを呼び出すことによって、StringBuilderコンス トラクターを含む、capacityパラメーター オブジェクトを作成するときにします。

  • 新しい値を明示的に割り当てることで、StringBuilder.Capacityプロパティを既存の展開StringBuilderオブジェクト。 新しい容量が、既存の容量またはより大きいより小さい場合、このプロパティは例外をスローします。 注意してください、StringBuilderオブジェクトの最大容量。

  • 呼び出すことによって、StringBuilder.EnsureCapacity新しい容量を持つメソッド。 新しい容量をより大きくなければなりません、StringBuilderオブジェクトの最大容量。 代入とは異なり、ただし、Capacityプロパティ、EnsureCapacity例外をスローしない場合は目的の新しい容量が、既存の容量より小さい。 この場合、メソッドの呼び出しには効果はありません。

文字列の長さが割り当てられている場合、StringBuilderコンス トラクターの呼び出し内のオブジェクトが既定の容量、または指定した容量を超えています、Capacityプロパティで指定した文字列の長さに設定されて、valueパラメーター。

最大容量を明示的に定義することができます、StringBuilderオブジェクトを呼び出すことによって、StringBuilder(Int32, Int32)コンス トラクター。 新しい値を割り当てることで、最大容量を変更することはできません、MaxCapacityプロパティは読み取り専用です。

前のセクションとして表示、既存の容量が不十分な追加のメモリが割り当てられていると容量をStringBuilderオブジェクトによって定義された値までの 2 倍、MaxCapacityプロパティ。

一般に、既定の容量と最大の容量は、ほとんどのアプリのための適切なは。 次の条件下でこれらの値の設定を検討する可能性があります。

  • 場合の最終的なサイズ、StringBuilderオブジェクトをメガ バイトを超える場合通常は非常に大きくなる可能性があります。 この場合、する可能性があります、最初の設定からのパフォーマンスが向上Capacityを格段に高い値に多くのメモリ再割り当てする必要のないプロパティです。

  • 場合は、アプリは限られたメモリを持つシステムで実行されています。 この場合、設定を考慮することがあります、MaxCapacityプロパティをより小さいInt32.MaxValue場合は、アプリがメモリに制約がある環境で実行する可能性のある長い文字列を処理します。

StringBuilder オブジェクトをインスタンス化します。

インスタンス化する、StringBuilderその 6 つクラスのオーバー ロードされたコンス トラクターの次の表に示されているいずれかを呼び出すオブジェクト。 コンス トラクターの 3 つのインスタンスを作成、StringBuilderオブジェクトの値が空の文字列に設定がそのCapacityMaxCapacity値が異なります。 残りの 3 つのコンス トラクターを定義、StringBuilder特定の文字列値と容量を持つオブジェクト。 既定の最大容量を使用して、3 つのコンス トラクターの 2 つInt32.MaxValue、3 つ目では、最大容量を設定できます。

コンストラクター 文字列値 容量 最大容量
StringBuilder() String.Empty 16 Int32.MaxValue
StringBuilder(Int32) String.Empty によって定義されている、capacityパラメーター Int32.MaxValue
StringBuilder(Int32, Int32) String.Empty によって定義されている、capacityパラメーター によって定義されている、maxCapacityパラメーター
StringBuilder(String) によって定義されている、valueパラメーター 16 またはvalueします。 Length、大きい方になります Int32.MaxValue
StringBuilder(String, Int32) によって定義されている、valueパラメーター によって定義されている、capacityパラメーターまたはvalueします。 Length、大きい方になります。 Int32.MaxValue
StringBuilder(String, Int32, Int32, Int32) によって定義されたvalueします。 Substring(startIndex, length) によって定義されている、capacityパラメーターまたはvalueします。 Length、大きい方になります。 によって定義されている、maxCapacityパラメーター

インスタンスを作成するのには次の例でこれらのコンス トラクター オーバー ロードのうち 3 つStringBuilderオブジェクト。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      string value = "An ordinary string";
      int index = value.IndexOf("An ") + 3;
      int capacity = 0xFFFF;
      
      // Instantiate a StringBuilder from a string.
      StringBuilder sb1 = new StringBuilder(value);
      ShowSBInfo(sb1); 
      
      // Instantiate a StringBuilder from string and define a capacity.  
      StringBuilder sb2 = new StringBuilder(value, capacity);   
      ShowSBInfo(sb2); 
      
      // Instantiate a StringBuilder from substring and define a capacity.  
      StringBuilder sb3 = new StringBuilder(value, index, 
                                            value.Length - index, 
                                            capacity );
      ShowSBInfo(sb3); 
   }

   public static void ShowSBInfo(StringBuilder sb)
   {
      Console.WriteLine("\nValue: {0}", sb.ToString());
      foreach (var prop in sb.GetType().GetProperties()) {
         if (prop.GetIndexParameters().Length == 0)
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb));
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    Value: An ordinary string
//    Capacity: 18    MaxCapacity: 2,147,483,647    Length: 18
//    
//    Value: An ordinary string
//    Capacity: 65,535    MaxCapacity: 2,147,483,647    Length: 18
//    
//    Value: ordinary string
//    Capacity: 65,535    MaxCapacity: 2,147,483,647    Length: 15
Imports System.Text

Module Example
   Public Sub Main()
      Dim value As String = "An ordinary string"
      Dim index As Integer = value.IndexOf("An ") + 3
      Dim capacity As Integer = &hFFFF
      
      ' Instantiate a StringBuilder from a string.
      Dim sb1 As New StringBuilder(value)
      ShowSBInfo(sb1) 
      
      ' Instantiate a StringBuilder from string and define a capacity.  
      Dim sb2 As New StringBuilder(value, capacity)   
      ShowSBInfo(sb2) 
      
      ' Instantiate a StringBuilder from substring and define a capacity.  
      Dim sb3 As New StringBuilder(value, index, 
                                   value.Length - index, 
                                   capacity )
      ShowSBInfo(sb3) 
   End Sub
   
   Public Sub ShowSBInfo(sb As StringBuilder)
      Console.WriteLine()
      Console.WriteLine("Value: {0}", sb.ToString())
      For Each prop In sb.GetType().GetProperties
         If prop.GetIndexParameters().Length = 0 Then
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb))
         End If   
      Next
      Console.WriteLine()
   End Sub
End Module
' The example displays the following output:
'    Value: An ordinary string
'    Capacity: 18    MaxCapacity: 2,147,483,647    Length: 18
'    
'    Value: An ordinary string
'    Capacity: 65,535    MaxCapacity: 2,147,483,647    Length: 18
'    
'    Value: ordinary string
'    Capacity: 65,535    MaxCapacity: 2,147,483,647    Length: 15

StringBuilder のメソッドを呼び出す

内の文字列を変更するメソッドのほとんどをStringBuilderインスタンスがその同じインスタンスへの参照を返します。 これを使用すると、呼び出すStringBuilderメソッドが 2 つの方法で。

  • 個々 のメソッドを呼び出すことし、次の例のように、戻り値を無視することができます。

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          StringBuilder sb = new StringBuilder();
          sb.Append("This is the beginning of a sentence, ");
          sb.Replace("the beginning of ", "");
          sb.Insert(sb.ToString().IndexOf("a ") + 2, "complete ");
          sb.Replace(",", ".");
          Console.WriteLine(sb.ToString());
       }
    }
    // The example displays the following output:
    //        This is a complete sentence.
    
    Imports System.Text
    
    Module Example
       Public Sub Main()
          Dim sb As New StringBuilder()
          sb.Append("This is the beginning of a sentence, ")
          sb.Replace("the beginning of ", "")
          sb.Insert(sb.ToString().IndexOf("a ") + 2, "complete ")
          sb.Replace(",", ".")
          Console.WriteLine(sb.ToString())
       End Sub
    End Module
    ' The example displays the following output:
    '       This is a complete sentence.
    
  • 単一のステートメントでは、一連のメソッド呼び出しを行うことができます。 これは、一連の操作のチェーンを 1 つのステートメントを記述する場合に便利です。 次の例では、前の例から次の 3 つのメソッド呼び出しを 1 行のコードに統合します。

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          StringBuilder sb = new StringBuilder("This is the beginning of a sentence, ");
          sb.Replace("the beginning of ", "").Insert(sb.ToString().IndexOf("a ") + 2, 
                                                     "complete ").Replace(",", ".");
          Console.WriteLine(sb.ToString());
       }
    }
    // The example displays the following output:
    //        This is a complete sentence.
    
    Imports System.Text
    
    Module Example
       Public Sub Main()
          Dim sb As New StringBuilder("This is the beginning of a sentence, ")
          sb.Replace("the beginning of ", "").Insert(sb.ToString().IndexOf("a ") + 2, _
                                                     "complete ").Replace(", ", ".")
          Console.WriteLine(sb.ToString())
       End Sub
    End Module
    ' The example displays the following output:
    '       This is a complete sentence.
    

StringBuilder の操作を実行します。

メソッドを使用することができます、StringBuilder反復処理する、追加、削除、または内の文字を変更するにはクラス、StringBuilderオブジェクト。

StringBuilder の文字を反復処理します。

内の文字にアクセスすることができます、StringBuilderオブジェクトを使用して、StringBuilder.Chars[Int32]プロパティ。 C# でChars[Int32]。 インデクサーは、Visual basic での既定のプロパティは、StringBuilderクラス。 これにより、明示的に参照しなくても、インデックスのみを使用して、個々 の文字を取得または設定、Chars[Int32]プロパティ。 内の文字をStringBuilderオブジェクトがインデックス 0 (ゼロ) から始まり、インデックスを続行Length- 1。

次の例を示しています、Chars[Int32]プロパティ。 10 個のランダムな数字を追加、StringBuilderオブジェクト、および反復処理し、各文字。 場合は、文字の Unicode カテゴリUnicodeCategory.DecimalDigitNumber数を減らすことを 1 つ (またはその値が 0 の場合、数は 9 に変更)。 この例の内容を表示する、StringBuilder前に、と後、個々 の文字の値が変更されたオブジェクトの両方。

using System;
using System.Globalization;
using System.Text;

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      StringBuilder sb = new StringBuilder();
      
      // Generate 10 random numbers and store them in a StringBuilder.
      for (int ctr = 0; ctr <= 9; ctr++)
         sb.Append(rnd.Next().ToString("N5"));    

      Console.WriteLine("The original string:");
      Console.WriteLine(sb.ToString());
            
      // Decrease each number by one.
      for (int ctr = 0; ctr < sb.Length; ctr++) {
         if (Char.GetUnicodeCategory(sb[ctr]) == UnicodeCategory.DecimalDigitNumber) {
            int number = (int) Char.GetNumericValue(sb[ctr]);
            number--;
            if (number < 0) number = 9;
         
            sb[ctr] = number.ToString()[0];
         }
      }
      Console.WriteLine("\nThe new string:");
      Console.WriteLine(sb.ToString());
   }
}
// The example displays the following output:
//    The original string:
//    1,457,531,530.00000940,522,609.000001,668,113,564.000001,998,992,883.000001,792,660,834.00
//    000101,203,251.000002,051,183,075.000002,066,000,067.000001,643,701,043.000001,702,382,508
//    .00000
//    
//    The new string:
//    0,346,420,429.99999839,411,598.999990,557,002,453.999990,887,881,772.999990,681,559,723.99
//    999090,192,140.999991,940,072,964.999991,955,999,956.999990,532,690,932.999990,691,271,497
//    .99999
Imports System.Globalization
Imports System.Text

Module Example
   Public Sub Main()
      Dim rnd As New Random()
      Dim sb As New StringBuilder()
      
      ' Generate 10 random numbers and store them in a StringBuilder.
      For ctr As Integer = 0 To 9
         sb.Append(rnd.Next().ToString("N5"))    
      Next
      Console.WriteLine("The original string:")
      Console.WriteLine(sb.ToString())
      Console.WriteLine()
            
      ' Decrease each number by one.
      For ctr As Integer = 0 To sb.Length - 1
         If Char.GetUnicodeCategory(sb(ctr)) = UnicodeCategory.DecimalDigitNumber Then
            Dim number As Integer = CType(Char.GetNumericValue(sb(ctr)), Integer)
            number -= 1
            If number < 0 Then number = 9
         
            sb(ctr) = number.ToString()(0)
         End If
      Next
      Console.WriteLine("The new string:")
      Console.WriteLine(sb.ToString())
   End Sub
End Module
' The example displays the following output:
'    The original string:
'    1,457,531,530.00000940,522,609.000001,668,113,564.000001,998,992,883.000001,792,660,834.00
'    000101,203,251.000002,051,183,075.000002,066,000,067.000001,643,701,043.000001,702,382,508
'    .00000
'    
'    The new string:
'    0,346,420,429.99999839,411,598.999990,557,002,453.999990,887,881,772.999990,681,559,723.99
'    999090,192,140.999991,940,072,964.999991,955,999,956.999990,532,690,932.999990,691,271,497
'    .99999

Chars[Int32] プロパティで文字ベースのインデックス付けを使用すると、次の条件下では非常に遅くなることがあります。

  • StringBuilder インスタンスが大きい (たとえば、数万文字が含まれている)。
  • StringBuilder が "チャンク化" している。 つまり、StringBuilder.Append などのメソッドの反復的な呼び出しにより、オブジェクトの StringBuilder.Capacity プロパティが自動的に展開され、メモリの新しいチャンクがそれに割り当てられています。

文字にアクセスするたびに、チャンクのリンク リスト全体が走査されて、インデックスを付ける適切なバッファーが検索されるため、パフォーマンスが著しく低下します。

注意

大きな "チャンク化" した StringBuilder オブジェクトの場合でも、1 つまたは少数の文字へのインデックス ベースのアクセスに Chars[Int32] プロパティを使うと、パフォーマンスへの影響はごくわずかです。通常、これは 0(n) 操作です。 StringBuilder オブジェクト内の文字を反復処理するときは、パフォーマンスに大きな影響が発生します。これは、O(n^2) 操作でます。

StringBuilder オブジェクトで文字ベースのインデックス付けを使うときにパフォーマンスの問題が発生する場合は、次のいずれかの回避策を使うことができます。

  • ToString メソッドを呼び出して StringBuilder インスタンスを String に変換した後、文字列内の文字にアクセスします。

  • 既存の StringBuilder オブジェクトの内容を、事前にサイズを設定した新しい StringBuilder オブジェクトにコピーします。 新しい StringBuilder オブジェクトはチャンク化していないため、パフォーマンスが向上します。 例:

    // sbOriginal is the existing StringBuilder object
    var sbNew = new StringBuilder(sbOriginal.ToString(), sbOriginal.Length);
    
    ' sbOriginal is the existing StringBuilder object
    Dim sbNew = New StringBuilder(sbOriginal.ToString(), sbOriginal.Length)
    
  • StringBuilder(Int32) コンストラクターを呼び出して、StringBuilder オブジェクトの初期容量を、予想される最大サイズにほぼ等しい値に設定します。 このようにすると、StringBuilder が最大容量に達することがほとんどない場合であっても、メモリ ブロック全体が割り当てられることに注意してください。

StringBuilder オブジェクトへのテキストの追加

StringBuilderクラスには内容を拡張するために、次のメソッドが含まれています、StringBuilderオブジェクト。

  • Appendメソッドは、追加、文字列、部分文字列、文字配列を文字配列の一部分 1 つの文字が複数回繰り返されるまたはプリミティブ データの文字列形式の入力をStringBuilderオブジェクト。

  • AppendLine行終端記号またはに行終端記号と共に、文字列、メソッドが追加され、StringBuilderオブジェクト。

  • AppendFormatメソッドは、追加に、StringBuilderオブジェクト。 結果の文字列に含まれているオブジェクトの文字列形式には、現在のシステム カルチャまたは指定されたカルチャの書式指定規則を反映できます。

  • Insertメソッドは、挿入、文字列を部分文字列、文字列の複数の繰り返し、文字配列、文字の配列の一部またはプリミティブ データの文字列形式の入力で指定した位置にある、StringBuilderオブジェクト。 位置は、0 から始まるインデックスによって定義されます。

次の例では、 AppendAppendLineAppendFormat、およびInsertのテキストを展開する方法、StringBuilderオブジェクト。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      // Create a StringBuilder object with no text.
      StringBuilder sb = new StringBuilder();
      // Append some text.
      sb.Append('*', 10).Append(" Adding Text to a StringBuilder Object ").Append('*', 10);
      sb.AppendLine("\n");
      sb.AppendLine("Some code points and their corresponding characters:");
      // Append some formatted text.
      for (int ctr = 50; ctr <= 60; ctr++) {
         sb.AppendFormat("{0,12:X4} {1,12}", ctr, Convert.ToChar(ctr));
         sb.AppendLine();
      }
      // Find the end of the introduction to the column.
      int pos = sb.ToString().IndexOf("characters:") + 11 + 
                Environment.NewLine.Length;
      // Insert a column header.
      sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit", 
                                   "Character", "\n"));      

      // Convert the StringBuilder to a string and display it.      
      Console.WriteLine(sb.ToString());      
   }
}
// The example displays the following output:
//    ********** Adding Text to a StringBuilder Object **********
//    
//    Some code points and their corresponding characters:
//    
//       Code Unit    Character
//            0032            2
//            0033            3
//            0034            4
//            0035            5
//            0036            6
//            0037            7
//            0038            8
//            0039            9
//            003A            :
//            003B            ;
//            003C            <
Imports System.Text

Module Example
   Public Sub Main()
      ' Create a StringBuilder object with no text.
      Dim sb As New StringBuilder()
      ' Append some text.
      sb.Append("*"c, 10).Append(" Adding Text to a StringBuilder Object ").Append("*"c, 10)
      sb.AppendLine()
      sb.AppendLine()
      sb.AppendLine("Some code points and their corresponding characters:")
      ' Append some formatted text.
      For ctr = 50 To 60
         sb.AppendFormat("{0,12:X4} {1,12}", ctr, Convert.ToChar(ctr))
         sb.AppendLine()
      Next
      ' Find the end of the introduction to the column.
      Dim pos As Integer = sb.ToString().IndexOf("characters:") + 11 + 
                           Environment.NewLine.Length
      ' Insert a column header.
      sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit", 
                                   "Character", vbCrLf))      

      ' Convert the StringBuilder to a string and display it.      
      Console.WriteLine(sb.ToString())      
   End Sub
End Module
' The example displays the following output:
'       ********** Adding Text to a StringBuilder Object **********
'       
'       Some code points and their corresponding characters:
'       
'          Code Unit    Character
'               0032            2
'               0033            3
'               0034            4
'               0035            5
'               0036            6
'               0037            7
'               0038            8
'               0039            9
'               003A            :
'               003B            ;
'               003C            <

StringBuilder オブジェクトからテキストを削除

StringBuilderクラスには、現在のサイズを減らすためのメソッドが含まれます。StringBuilderインスタンス。 Clearメソッドすべての文字を削除し、設定、Lengthプロパティを 0 にします。 Removeメソッドは、指定された数の特定のインデックス位置から始まる文字を削除します。 さらの末尾から文字を削除することができます、StringBuilderオブジェクトを設定してそのLengthプロパティを現在のインスタンスの長さよりも小さい値にします。

次の例では、削除からのテキストの一部をStringBuilderオブジェクト、その結果として得られる容量、最大容量は、および長さのプロパティの値を表示およびを呼び出して、Clearからすべての文字を削除する方法、StringBuilderオブジェクト。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder("A StringBuilder object");
      ShowSBInfo(sb);
      // Remove "object" from the text.
      string textToRemove = "object";
      int pos = sb.ToString().IndexOf(textToRemove);
      if (pos >= 0) {
         sb.Remove(pos, textToRemove.Length);
         ShowSBInfo(sb);
      }
      // Clear the StringBuilder contents.
      sb.Clear();
      ShowSBInfo(sb);   
   }

   public static void ShowSBInfo(StringBuilder sb)
   {
      Console.WriteLine("\nValue: {0}", sb.ToString());
      foreach (var prop in sb.GetType().GetProperties()) {
         if (prop.GetIndexParameters().Length == 0)
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb));
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    Value: A StringBuilder object
//    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 22
//    
//    Value: A StringBuilder
//    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 16
//    
//    Value:
//    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 0
Imports System.Text

Module Example
   Public Sub Main()
      Dim sb As New StringBuilder("A StringBuilder object")
      ShowSBInfo(sb)
      ' Remove "object" from the text.
      Dim textToRemove As String = "object"
      Dim pos As Integer = sb.ToString().IndexOf(textToRemove)
      If pos >= 0
         sb.Remove(pos, textToRemove.Length)
         ShowSBInfo(sb)
      End If
      ' Clear the StringBuilder contents.
      sb.Clear()
      ShowSBInfo(sb)   
   End Sub

   Public Sub ShowSBInfo(sb As StringBuilder)
      Console.WriteLine()
      Console.WriteLine("Value: {0}", sb.ToString())
      For Each prop In sb.GetType().GetProperties
         If prop.GetIndexParameters().Length = 0 Then
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb))
         End If   
      Next
      Console.WriteLine()
   End Sub
End Module
' The example displays the following output:
'    Value: A StringBuilder object
'    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 22
'    
'    Value: A StringBuilder
'    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 16
'    
'    Value:
'    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 0

StringBuilder オブジェクトの文字列を変更します。

StringBuilder.Replaceメソッドは文字または文字列全体でのすべての出現箇所を置き換えるStringBuilderオブジェクトまたは特定の文字範囲内です。 次の例では、Replace疑問符 (?) ですべての感嘆符 (!) を置換するメソッド、StringBuilderオブジェクト。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
      MyStringBuilder.Replace('!', '?');
      Console.WriteLine(MyStringBuilder);
   }
}
// The example displays the following output:
//       Hello World?
Imports System.Text

Module Example
   Public Sub Main()
      Dim MyStringBuilder As New StringBuilder("Hello World!")
      MyStringBuilder.Replace("!"c, "?"c)
      Console.WriteLine(MyStringBuilder)
   End Sub
End Module
' The example displays the following output:
'       Hello World?

StringBuilder オブジェクトのテキストを検索

StringBuilderクラスと同様の方法を含まない、 String.ContainsString.IndexOf、およびString.StartsWithによって提供されるメソッド、Stringクラスは、特定の文字または部分文字列のオブジェクトを検索できます。 かどうかを決定する以降の部分文字列の文字の位置は、検索することが必要です、String文字列検索メソッドまたは正規表現メソッドを使用して値。 次の表に示すよう、このような検索を実装するために 4 つの方法はあります。

手法 プロフェッショナル 短所
追加する前に文字列値を検索、StringBuilderオブジェクト。 部分文字列が存在するかどうかを決定するために便利です。 部分文字列のインデックス位置が重要では使用できません。
呼び出すToStringと、返された検索Stringオブジェクト。 簡単に使用するすべてのテキストを割り当てた場合、StringBuilderオブジェクト、および変更を開始します。 繰り返し呼び出すことの面倒なToStringかどうかにすべてのテキストを追加する前に変更を行う必要があります、StringBuilderオブジェクト。

末尾から作業することが、StringBuilder変更を加えている場合は、オブジェクトのテキスト。
使用して、Chars[Int32]文字の範囲を順番に検索するプロパティ。 個々 の文字または小さな部分文字列の心配がある場合に役立ちます。 検索対象の文字数が多い場合、または検索ロジックが複雑な場合は煩雑です。

繰り返されるメソッドの呼び出しを通じて、非常に大きなが大きくなったオブジェクトのパフォーマンスを大幅に低下の結果。
変換、StringBuilderオブジェクトをStringオブジェクトし、の変更を行う、Stringオブジェクト。 変更の数が少ない場合に役立ちます。 パフォーマンスの利点を否定、StringBuilderクラスの変更の数が大きい場合。

これらの手法を詳しく見ていきましょう。

  • 検索の目的でそれらを格納する前に文字列を検索することができます (つまり、部分文字列の位置に興味がない) 場合に特定の部分文字列が存在するかどうかを判断する場合、StringBuilderオブジェクト。 次の例では、1 つの考えられる実装を提供します。 定義、StringBuilderFinderクラスのコンス トラクターへの参照が渡される、StringBuilderオブジェクトと、文字列内で検索する部分文字列。 例が記録された気温が華氏または摂氏はおよびの先頭に適切な概要説明のテキストを追加するかどうかを決定しようとしたこの例では、StringBuilderオブジェクト。 乱数ジェネレーターを使用して、摂氏または華氏のいずれかでデータを格納する配列を選択します。

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          Random rnd = new Random();
          string[] tempF = { "47.6F", "51.3F", "49.5F", "62.3F" };
          string[] tempC = { "21.2C", "16.1C", "23.5C", "22.9C" };
          string[][] temps = { tempF, tempC }; 
    
          StringBuilder sb = new StringBuilder();
          var f = new StringBuilderFinder(sb, "F");
          var baseDate = new DateTime(2013, 5, 1); 
          String[] temperatures = temps[rnd.Next(2)];
          bool isFahrenheit = false;
          foreach (var temperature in temperatures) {
             if (isFahrenheit)
                sb.AppendFormat("{0:d}: {1}\n", baseDate, temperature);
             else
                isFahrenheit = f.SearchAndAppend(String.Format("{0:d}: {1}\n", 
                                                 baseDate, temperature));
             baseDate = baseDate.AddDays(1);
          }            
          if (isFahrenheit) {
             sb.Insert(0, "Average Daily Temperature in Degrees Fahrenheit");
             sb.Insert(47, "\n\n");
          }
          else {
             sb.Insert(0, "Average Daily Temperature in Degrees Celsius");
             sb.Insert(44, "\n\n");
          }   
          Console.WriteLine(sb.ToString());
       }
    }
    
    public class StringBuilderFinder
    {
       private StringBuilder sb;
       private String text;
       
       public StringBuilderFinder(StringBuilder sb, String textToFind)
       {
          this.sb = sb;
          this.text = textToFind;
       }
       
       public bool SearchAndAppend(String stringToSearch)
       {
          sb.Append(stringToSearch);
          return stringToSearch.Contains(text);
       }
    }
    // The example displays output similar to the following:
    //    Average Daily Temperature in Degrees Celsius
    //    
    //    5/1/2013: 21.2C
    //    5/2/2013: 16.1C
    //    5/3/2013: 23.5C
    //    5/4/2013: 22.9C
    
    Imports System.Text
    
    Module Example
       Public Sub Main()
          Dim rnd As New Random()
          Dim tempF() As String = { "47.6F", "51.3F", "49.5F", "62.3F" }
          Dim tempC() As String = { "21.2C", "16.1C", "23.5C", "22.9C" }
          Dim temps()() As String = { tempF, tempC } 
    
          Dim sb As StringBuilder = New StringBuilder()
          Dim f As New StringBuilderFinder(sb, "F")
          Dim baseDate As New DateTime(2013, 5, 1) 
          Dim temperatures() As String = temps(rnd.Next(2))
          Dim isFahrenheit As Boolean = False
          For Each temperature In temperatures
             If isFahrenheit Then
                sb.AppendFormat("{0:d}: {1}{2}", baseDate, temperature, vbCrLf)
             Else
                isFahrenheit = f.SearchAndAppend(String.Format("{0:d}: {1}{2}", 
                                                 baseDate, temperature, vbCrLf))
             End If
             baseDate = baseDate.AddDays(1)
          Next            
          If isFahrenheit Then
             sb.Insert(0, "Average Daily Temperature in Degrees Fahrenheit")
             sb.Insert(47, vbCrLf + vbCrLf)
          Else
             sb.Insert(0, "Average Daily Temperature in Degrees Celsius")
             sb.Insert(44, vbCrLf + vbCrLf)
          End If   
          Console.WriteLine(sb.ToString())
       End Sub
    End Module
    
    Public Class StringBuilderFinder
       Private sb As StringBuilder
       Private text As String
       
       Public Sub New(sb As StringBuilder, textToFind As String)
          Me.sb = sb
          text = textToFind
       End Sub
       
       Public Function SearchAndAppend(stringToSearch As String) As Boolean
          sb.Append(stringToSearch)
          Return stringToSearch.Contains(text)
       End Function
    End Class
    ' The example displays output similar to the following:
    '    Average Daily Temperature in Degrees Celsius
    '    
    '    5/1/2013: 21.2C
    '    5/2/2013: 16.1C
    '    5/3/2013: 23.5C
    '    5/4/2013: 22.9C
    
  • 呼び出す、StringBuilder.ToStringに変換するメソッド、StringBuilderオブジェクトをStringオブジェクト。 などのメソッドを使用して、文字列を検索するString.LastIndexOfまたはString.StartsWith、正規表現を使用することも、Regexパターンを検索するクラス。 両方StringBuilderStringオブジェクトを使用して、utf-16 エンコード文字の部分文字列の文字のインデックス位置を格納して、正規表現の一致が両方のオブジェクトで同じです。 これにより、使用するStringBuilderでそのテキストが見つかった位置の同じ位置で変更を行う方法、Stringオブジェクト。

    注意

    このアプローチを採用する場合は、末尾から作業する必要があります、StringBuilder繰り返しに変換する必要があるないように、その以降にオブジェクト、StringBuilderオブジェクトを文字列。

    このアプローチの例を次に示します。 英語のアルファベットの各文字の 4 つの出現回数を格納、StringBuilderオブジェクト。 テキストを次に、変換、Stringオブジェクトごとの 4 文字のシーケンスの開始位置を識別するために正規表現を使用しています。 最後に、最初のシーケンスを除く各 4 文字のシーケンスの前にアンダー スコアを追加し、大文字に、シーケンスの最初の文字に変換します。

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public class Example
    {
       public static void Main()
       {
          // Create a StringBuilder object with 4 successive occurrences 
          // of each character in the English alphabet. 
          StringBuilder sb = new StringBuilder();
          for (ushort ctr = (ushort)'a'; ctr <= (ushort) 'z'; ctr++)
             sb.Append(Convert.ToChar(ctr), 4);
          
          // Create a parallel string object.
          String sbString = sb.ToString();
          // Determine where each new character sequence begins.
          String pattern = @"(\w)\1+";
          MatchCollection matches = Regex.Matches(sbString, pattern);
    
          // Uppercase the first occurrence of the sequence, and separate it
          // from the previous sequence by an underscore character.
          for (int ctr = matches.Count - 1; ctr >= 0; ctr--) { 
             Match m = matches[ctr];
             sb[m.Index] = Char.ToUpper(sb[m.Index]);
             if (m.Index > 0) sb.Insert(m.Index, "_");
          }
          // Display the resulting string.
          sbString = sb.ToString();
          int line = 0;
          do {
             int nChars = line * 80 + 79 <= sbString.Length ? 
                                 80 : sbString.Length - line * 80;
             Console.WriteLine(sbString.Substring(line * 80, nChars));
             line++;
          } while (line * 80 < sbString.Length);
       }
    }
    // The example displays the following output:
    //    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    //    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    
    Imports System.Text
    Imports System.Text.RegularExpressions
    
    Module Example
       Public Sub Main()
          ' Create a StringBuilder object with 4 successive occurrences 
          ' of each character in the English alphabet. 
          Dim sb As New StringBuilder()
          For ctr As UShort = AscW("a") To Ascw("z")
             sb.Append(ChrW(ctr), 4)
          Next    
          ' Create a parallel string object.
          Dim sbString As String = sb.ToString()
          ' Determine where each new character sequence begins.
          Dim pattern As String = "(\w)\1+"
          Dim matches As MatchCollection = Regex.Matches(sbString, pattern)
    
          ' Uppercase the first occurrence of the sequence, and separate it
          ' from the previous sequence by an underscore character.
          For ctr As Integer = matches.Count - 1 To 0 Step -1 
             Dim m As Match = matches(ctr)
             sb.Chars(m.Index) = Char.ToUpper(sb.Chars(m.index))
             If m.Index > 0 Then sb.Insert(m.Index, "_")
          Next
          ' Display the resulting string.
          sbString = sb.ToString()
          Dim line As Integer = 0
          Do
             Dim nChars As Integer = If(line * 80 + 79 <= sbString.Length, 
                                        80, sbString.Length - line * 80)
             Console.WriteLine(sbString.Substring(line * 80, nChars))
             line += 1
          Loop While line * 80 < sbString.Length
       End Sub
    End Module
    ' The example displays the following output:
    '    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    '    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    
  • 使用して、StringBuilder.Chars[Int32]で文字の範囲を順番に検索するプロパティをStringBuilderオブジェクト。 検索する文字数が大きい場合や、検索ロジックが特に複雑な場合、このアプローチを実用的なできない可能性があります。 文字のインデックス ベースのアクセスのパフォーマンスに影響する非常に大きな、chunkedStringBuilderオブジェクト、ドキュメントを参照して、StringBuilder.Chars[Int32]プロパティ。

    次の例では、前の例と同じ機能ですが、実装では異なります。 使用して、Chars[Int32]文字の値が変更されたときを検出するためにプロパティが、その位置にアンダー スコアを挿入し、新しいシーケンスの最初の文字を大文字に変換します。

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          // Create a StringBuilder object with 4 successive occurrences 
          // of each character in the English alphabet. 
          StringBuilder sb = new StringBuilder();
          for (ushort ctr = (ushort) 'a'; ctr <= (ushort) 'z'; ctr++)
             sb.Append(Convert.ToChar(ctr), 4);
    
          // Iterate the text to determine when a new character sequence occurs.
          int position = 0;
          Char current = '\u0000';
          do {
             if (sb[position] != current) {
                current = sb[position];
                sb[position] = Char.ToUpper(sb[position]);
                if (position > 0) 
                   sb.Insert(position, "_");
                position += 2;
             }
             else {
                position++;
             }      
          } while (position <= sb.Length - 1);
          // Display the resulting string.
          String sbString = sb.ToString();
          int line = 0;
          do {
             int nChars = line * 80 + 79 <= sbString.Length ? 
                                 80 : sbString.Length - line * 80;
             Console.WriteLine(sbString.Substring(line * 80, nChars));
             line++;
          } while (line * 80 < sbString.Length);
       }
    }
    // The example displays the following output:
    //    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    //    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    
    Imports System.Text
    
    Module Example
       Public Sub Main()
          ' Create a StringBuilder object with 4 successive occurrences 
          ' of each character in the English alphabet. 
          Dim sb As New StringBuilder()
          For ctr As UShort = AscW("a") To Ascw("z")
             sb.Append(ChrW(ctr), 4)
          Next    
          ' Iterate the text to determine when a new character sequence occurs.
          Dim position As Integer = 0
          Dim current As Char = ChrW(0)
          Do
             If sb(position) <> current Then
                current = sb(position)
                sb(position) = Char.ToUpper(sb(position))
                If position > 0 Then sb.Insert(position, "_")
                position += 2
             Else
                position += 1
             End If      
          Loop While position <= sb.Length - 1
          ' Display the resulting string.
          Dim sbString As String = sb.ToString()
          Dim line As Integer = 0
          Do
             Dim nChars As Integer = If(line * 80 + 79 <= sbString.Length, 
                                        80, sbString.Length - line * 80)
             Console.WriteLine(sbString.Substring(line * 80, nChars))
             line += 1
          Loop While line * 80 < sbString.Length
       End Sub
    End Module
    ' The example displays the following output:
    '    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    '    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    
  • 変更されていないすべてのテキストを格納、StringBuilderオブジェクトを呼び出し、StringBuilder.ToStringに変換するメソッド、StringBuilderオブジェクトをStringオブジェクトとに、変更が行わ、Stringオブジェクト。 このアプローチを使用するには、いくつか変更にのみがある場合それ以外の場合、不変の文字列の操作のコストは可能性がありますを使用してのパフォーマンスの利点を負数化、StringBuilderオブジェクト。

    次の例では、前の 2 つの例と同じ機能ですが、実装では異なります。 作成、StringBuilderオブジェクトに変換する、Stringオブジェクト、および正規表現を使用して、文字列の残りのすべての変更を実行します。 Regex.Replace(String, String, MatchEvaluator)メソッドでは、ラムダ式を使用して、一致した各文字列の置換を実行します。

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public class Example
    {
       public static void Main()
       {
          // Create a StringBuilder object with 4 successive occurrences 
          // of each character in the English alphabet. 
          StringBuilder sb = new StringBuilder();
          for (ushort ctr = (ushort)'a'; ctr <= (ushort) 'z'; ctr++)
             sb.Append(Convert.ToChar(ctr), 4);
         
          // Convert it to a string.
          String sbString = sb.ToString();
    
          // Use a regex to uppercase the first occurrence of the sequence, 
          // and separate it from the previous sequence by an underscore.
          string pattern = @"(\w)(\1+)";
          sbString = Regex.Replace(sbString, pattern, 
                                   m => (m.Index > 0 ? "_" : "") + 
                                   m.Groups[1].Value.ToUpper() + 
                                   m.Groups[2].Value);
    
          // Display the resulting string.
          int line = 0;
          do {
             int nChars = line * 80 + 79 <= sbString.Length ? 
                                 80 : sbString.Length - line * 80;
             Console.WriteLine(sbString.Substring(line * 80, nChars));
             line++;
          } while (line * 80 < sbString.Length);
       }
    }
    // The example displays the following output:
    //    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    //    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    
    Imports System.Text
    Imports System.Text.RegularExpressions
    
    Module Example
       Public Sub Main()
          ' Create a StringBuilder object with 4 successive occurrences 
          ' of each character in the English alphabet. 
          Dim sb As New StringBuilder()
          For ctr As UShort = AscW("a") To Ascw("z")
             sb.Append(ChrW(ctr), 4)
          Next    
          ' Convert it to a string.
          Dim sbString As String = sb.ToString()
    
          ' Use a regex to uppercase the first occurrence of the sequence, 
          ' and separate it from the previous sequence by an underscore.
          Dim pattern As String = "(\w)(\1+)"
          sbString = Regex.Replace(sbString, pattern, 
                                   Function(m) If(m.Index > 0,"_","") + 
                                               m.Groups(1).Value.ToUpper + 
                                               m.Groups(2).Value)
    
          ' Display the resulting string.
          Dim line As Integer = 0
          Do
             Dim nChars As Integer = If(line * 80 + 79 <= sbString.Length, 
                                        80, sbString.Length - line * 80)
             Console.WriteLine(sbString.Substring(line * 80, nChars))
             line += 1
          Loop While line * 80 < sbString.Length
       End Sub
    End Module
    ' The example displays the following output:
    '    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    '    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    

StringBuilder オブジェクトを文字列に変換します。

StringBuilder オブジェクトで表される文字列を String パラメーターを持つメソッドに渡すかそれをユーザー インターフェイスに表示するには、事前に StringBuilder オブジェクトを String オブジェクトに変換する必要があります。 呼び出すことによってこの変換を実行する、StringBuilder.ToStringメソッド。 例については、呼び出しの前の例を参照してください、ToStringに変換するメソッド、StringBuilderオブジェクトの文字列を正規表現メソッドに渡すことができるようにします。

注意 (呼び出し元)

.NET Core と .NET Framework 4.0 および以降のバージョンでインスタンス化するとき、StringBuilderオブジェクトを呼び出すことによって、StringBuilder(Int32, Int32)長さと容量の両方のコンス トラクター、StringBuilderインスタンスは、の値を超えて増加できますそのMaxCapacityプロパティ。 特に呼び出しが発生することができます、Append(String)AppendFormat(String, Object)小さな文字列を追加する方法。

コンストラクター

StringBuilder() StringBuilder() StringBuilder() StringBuilder()

StringBuilder クラスの新しいインスタンスを初期化します。

StringBuilder(Int32) StringBuilder(Int32) StringBuilder(Int32) StringBuilder(Int32)

指定した容量を使用して、StringBuilder クラスの新しいインスタンスを初期化します。

StringBuilder(Int32, Int32) StringBuilder(Int32, Int32) StringBuilder(Int32, Int32) StringBuilder(Int32, Int32)

指定した容量で始まり、指定した最大容量まで大きくなる StringBuilder クラスの新しいインスタンスを初期化します。

StringBuilder(String) StringBuilder(String) StringBuilder(String) StringBuilder(String)

指定した文字列を使用して、StringBuilder クラスの新しいインスタンスを初期化します。

StringBuilder(String, Int32) StringBuilder(String, Int32) StringBuilder(String, Int32) StringBuilder(String, Int32)

指定した文字列および容量を使用して、StringBuilder クラスの新しいインスタンスを初期化します。

StringBuilder(String, Int32, Int32, Int32) StringBuilder(String, Int32, Int32, Int32) StringBuilder(String, Int32, Int32, Int32) StringBuilder(String, Int32, Int32, Int32)

指定した部分文字列および容量から StringBuilder クラスの新しいインスタンスを初期化します。

プロパティ

Capacity Capacity Capacity Capacity

現在のインスタンスによって割り当てられたメモリに格納できる最大文字数を取得または設定します。

Chars[Int32] Chars[Int32] Chars[Int32] Chars[Int32]

このインスタンス内の指定した文字位置の文字を取得または設定します。

Length Length Length Length

現在の StringBuilder オブジェクトの長さを取得または設定します。

MaxCapacity MaxCapacity MaxCapacity MaxCapacity

このインスタンスの最大容量を取得します。

メソッド

Append(Boolean) Append(Boolean) Append(Boolean) Append(Boolean)

指定したブール値の文字列形式をこのインスタンスに追加します。

Append(Byte) Append(Byte) Append(Byte) Append(Byte)

指定した 8 ビット符号なし整数の文字列形式をこのインスタンスに追加します。

Append(Char) Append(Char) Append(Char) Append(Char)

指定した Char オブジェクトの文字列形式をこのインスタンスに追加します。

Append(Char*, Int32) Append(Char*, Int32) Append(Char*, Int32) Append(Char*, Int32)

指定したアドレスで始まる Unicode 文字の配列をこのインスタンスに追加します。

Append(Char, Int32) Append(Char, Int32) Append(Char, Int32) Append(Char, Int32)

Unicode 文字の文字列形式の、指定した数のコピーをこのインスタンスに追加します。

Append(Char[]) Append(Char[]) Append(Char[]) Append(Char[])

指定した配列内の Unicode 文字の文字列形式をこのインスタンスに追加します。

Append(Char[], Int32, Int32) Append(Char[], Int32, Int32) Append(Char[], Int32, Int32) Append(Char[], Int32, Int32)

Unicode 文字の指定した部分配列の文字列形式をこのインスタンスに追加します。

Append(Decimal) Append(Decimal) Append(Decimal) Append(Decimal)

指定した 10 進数の文字列形式をこのインスタンスに追加します。

Append(Double) Append(Double) Append(Double) Append(Double)

指定した倍精度浮動小数点数の文字列形式をこのインスタンスに追加します。

Append(Int16) Append(Int16) Append(Int16) Append(Int16)

指定した 16 ビット符号付き整数の文字列形式をこのインスタンスに追加します。

Append(Int32) Append(Int32) Append(Int32) Append(Int32)

指定した 32 ビット符号付き整数の文字列形式をこのインスタンスに追加します。

Append(Int64) Append(Int64) Append(Int64) Append(Int64)

指定した 64 ビット符号付き整数の文字列形式をこのインスタンスに追加します。

Append(Object) Append(Object) Append(Object) Append(Object)

指定したオブジェクトの文字列形式をこのインスタンスに追加します。

Append(ReadOnlySpan<Char>) Append(ReadOnlySpan<Char>) Append(ReadOnlySpan<Char>) Append(ReadOnlySpan<Char>)
Append(SByte) Append(SByte) Append(SByte) Append(SByte)

指定した 8 ビット符号付き整数の文字列形式をこのインスタンスに追加します。

Append(Single) Append(Single) Append(Single) Append(Single)

指定した単精度浮動小数点数の文字列形式をこのインスタンスに追加します。

Append(String) Append(String) Append(String) Append(String)

指定した文字列のコピーをこのインスタンスに追加します。

Append(String, Int32, Int32) Append(String, Int32, Int32) Append(String, Int32, Int32) Append(String, Int32, Int32)

指定した部分文字列のコピーをこのインスタンスに追加します。

Append(StringBuilder) Append(StringBuilder) Append(StringBuilder) Append(StringBuilder)
Append(StringBuilder, Int32, Int32) Append(StringBuilder, Int32, Int32) Append(StringBuilder, Int32, Int32) Append(StringBuilder, Int32, Int32)
Append(UInt16) Append(UInt16) Append(UInt16) Append(UInt16)

指定した 16 ビット符号なし整数の文字列形式をこのインスタンスに追加します。

Append(UInt32) Append(UInt32) Append(UInt32) Append(UInt32)

指定された 32 ビット符号なし整数の文字列表記をこのインスタンスに追加します。

Append(UInt64) Append(UInt64) Append(UInt64) Append(UInt64)

指定した 64 ビット符号なし整数の文字列形式をこのインスタンスに追加します。

AppendFormat(IFormatProvider, String, Object) AppendFormat(IFormatProvider, String, Object) AppendFormat(IFormatProvider, String, Object) AppendFormat(IFormatProvider, String, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに追加します。 各書式項目は、指定された書式プロバイダーを使用して単一の引数の文字列形式に置換されます。

AppendFormat(IFormatProvider, String, Object, Object) AppendFormat(IFormatProvider, String, Object, Object) AppendFormat(IFormatProvider, String, Object, Object) AppendFormat(IFormatProvider, String, Object, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに追加します。 各書式項目は、指定された書式プロバイダーを使用して 2 つの引数のいずれかの文字列形式に置換されます。

AppendFormat(IFormatProvider, String, Object, Object, Object) AppendFormat(IFormatProvider, String, Object, Object, Object) AppendFormat(IFormatProvider, String, Object, Object, Object) AppendFormat(IFormatProvider, String, Object, Object, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに追加します。 各書式項目は、指定された書式プロバイダーを使用して 3 つの引数のいずれかの文字列形式に置換されます。各書式項目は、指定された書式プロバイダーを使用して 3 つの引数のいずれかの文字列形式に置換されます。

AppendFormat(IFormatProvider, String, Object[]) AppendFormat(IFormatProvider, String, Object[]) AppendFormat(IFormatProvider, String, Object[]) AppendFormat(IFormatProvider, String, Object[])

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに追加します。 各書式項目は、指定された書式プロバイダーを使用した、パラメーター配列内の対応する引数の文字列形式に置換されます。

AppendFormat(String, Object) AppendFormat(String, Object) AppendFormat(String, Object) AppendFormat(String, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに追加します。 各書式項目は、単一の引数の文字列表記に置換されます。

AppendFormat(String, Object, Object) AppendFormat(String, Object, Object) AppendFormat(String, Object, Object) AppendFormat(String, Object, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに追加します。 各書式項目は、2 つの引数のどちらかの文字列形式に置換されます。

AppendFormat(String, Object, Object, Object) AppendFormat(String, Object, Object, Object) AppendFormat(String, Object, Object, Object) AppendFormat(String, Object, Object, Object)

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに追加します。 各書式項目は、3 つの引数のいずれかの文字列形式に置換されます。

AppendFormat(String, Object[]) AppendFormat(String, Object[]) AppendFormat(String, Object[]) AppendFormat(String, Object[])

0 個以上の書式項目を含んでいる複合書式指定文字列を処理することで返される文字列を、このインスタンスに追加します。 各書式項目は、パラメーター配列内の対応する引数の文字列形式に置換されます。

AppendJoin(Char, Object[]) AppendJoin(Char, Object[]) AppendJoin(Char, Object[]) AppendJoin(Char, Object[])
AppendJoin(Char, String[]) AppendJoin(Char, String[]) AppendJoin(Char, String[]) AppendJoin(Char, String[])
AppendJoin(String, Object[]) AppendJoin(String, Object[]) AppendJoin(String, Object[]) AppendJoin(String, Object[])
AppendJoin(String, String[]) AppendJoin(String, String[]) AppendJoin(String, String[]) AppendJoin(String, String[])
AppendJoin<T>(Char, IEnumerable<T>) AppendJoin<T>(Char, IEnumerable<T>) AppendJoin<T>(Char, IEnumerable<T>) AppendJoin<T>(Char, IEnumerable<T>)
AppendJoin<T>(String, IEnumerable<T>) AppendJoin<T>(String, IEnumerable<T>) AppendJoin<T>(String, IEnumerable<T>) AppendJoin<T>(String, IEnumerable<T>)
AppendLine() AppendLine() AppendLine() AppendLine()

既定の行終端記号を現在の StringBuilder オブジェクトの末尾に追加します。

AppendLine(String) AppendLine(String) AppendLine(String) AppendLine(String)

指定した文字列のコピーと既定の行終端記号を、現在の StringBuilder オブジェクトの末尾に追加します。

Clear() Clear() Clear() Clear()

現在の StringBuilder インスタンスからすべての文字を削除します。

CopyTo(Int32, Char[], Int32, Int32) CopyTo(Int32, Char[], Int32, Int32) CopyTo(Int32, Char[], Int32, Int32) CopyTo(Int32, Char[], Int32, Int32)

このインスタンスの指定したセグメントにある文字を、目的の Char 配列の指定したセグメントにコピーします。

CopyTo(Int32, Span<Char>, Int32) CopyTo(Int32, Span<Char>, Int32) CopyTo(Int32, Span<Char>, Int32) CopyTo(Int32, Span<Char>, Int32)
EnsureCapacity(Int32) EnsureCapacity(Int32) EnsureCapacity(Int32) EnsureCapacity(Int32)

このインスタンスの StringBuilder の容量が、指定した値以上になるようにします。

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。

(Inherited from Object)
Equals(ReadOnlySpan<Char>) Equals(ReadOnlySpan<Char>) Equals(ReadOnlySpan<Char>) Equals(ReadOnlySpan<Char>)
Equals(StringBuilder) Equals(StringBuilder) Equals(StringBuilder) Equals(StringBuilder)

このインスタンスが指定されたオブジェクトに等しいかどうかを示す値を返します。

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。

(Inherited from Object)
GetType() GetType() GetType() GetType()

現在のインスタンスの Type を取得します。

(Inherited from Object)
Insert(Int32, Boolean) Insert(Int32, Boolean) Insert(Int32, Boolean) Insert(Int32, Boolean)

Boolean 値の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Byte) Insert(Int32, Byte) Insert(Int32, Byte) Insert(Int32, Byte)

指定した 8 ビット符号なし整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Char) Insert(Int32, Char) Insert(Int32, Char) Insert(Int32, Char)

指定した Unicode 文字の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Char[]) Insert(Int32, Char[]) Insert(Int32, Char[]) Insert(Int32, Char[])

指定した Unicode 文字の配列の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Char[], Int32, Int32) Insert(Int32, Char[], Int32, Int32) Insert(Int32, Char[], Int32, Int32) Insert(Int32, Char[], Int32, Int32)

Unicode 文字の指定した部分配列の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Decimal) Insert(Int32, Decimal) Insert(Int32, Decimal) Insert(Int32, Decimal)

10 進数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Double) Insert(Int32, Double) Insert(Int32, Double) Insert(Int32, Double)

倍精度浮動小数点数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Int16) Insert(Int32, Int16) Insert(Int32, Int16) Insert(Int32, Int16)

指定した 16 ビット符号付き整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Int32) Insert(Int32, Int32) Insert(Int32, Int32) Insert(Int32, Int32)

指定した 32 ビット符号付き整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Int64) Insert(Int32, Int64) Insert(Int32, Int64) Insert(Int32, Int64)

64 ビット符号付き整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Object) Insert(Int32, Object) Insert(Int32, Object) Insert(Int32, Object)

オブジェクトの文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, ReadOnlySpan<Char>) Insert(Int32, ReadOnlySpan<Char>) Insert(Int32, ReadOnlySpan<Char>) Insert(Int32, ReadOnlySpan<Char>)
Insert(Int32, SByte) Insert(Int32, SByte) Insert(Int32, SByte) Insert(Int32, SByte)

指定した 8 ビット符号付き整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, Single) Insert(Int32, Single) Insert(Int32, Single) Insert(Int32, Single)

単精度浮動小数点数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, String) Insert(Int32, String) Insert(Int32, String) Insert(Int32, String)

文字列をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, String, Int32) Insert(Int32, String, Int32) Insert(Int32, String, Int32) Insert(Int32, String, Int32)

指定した文字列の 1 つ以上のコピーをこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, UInt16) Insert(Int32, UInt16) Insert(Int32, UInt16) Insert(Int32, UInt16)

16 ビット符号なし整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, UInt32) Insert(Int32, UInt32) Insert(Int32, UInt32) Insert(Int32, UInt32)

32 ビット符号なし整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

Insert(Int32, UInt64) Insert(Int32, UInt64) Insert(Int32, UInt64) Insert(Int32, UInt64)

64 ビット符号なし整数の文字列形式をこのインスタンスの指定した文字位置に挿入します。

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。

(Inherited from Object)
Remove(Int32, Int32) Remove(Int32, Int32) Remove(Int32, Int32) Remove(Int32, Int32)

このインスタンスから、指定した範囲の文字を削除します。

Replace(Char, Char) Replace(Char, Char) Replace(Char, Char) Replace(Char, Char)

このインスタンスに出現する指定文字をすべて、別に指定した文字に置換します。

Replace(Char, Char, Int32, Int32) Replace(Char, Char, Int32, Int32) Replace(Char, Char, Int32, Int32) Replace(Char, Char, Int32, Int32)

このインスタンスの部分文字列に出現するすべての指定した文字を、別の指定した文字に置換します。

Replace(String, String) Replace(String, String) Replace(String, String) Replace(String, String)

このインスタンスに出現するすべての指定した文字列を、別の指定した文字列に置換します。

Replace(String, String, Int32, Int32) Replace(String, String, Int32, Int32) Replace(String, String, Int32, Int32) Replace(String, String, Int32, Int32)

このインスタンスの部分文字列に出現するすべての指定した文字列を、別の指定した文字列に置換します。

ToString() ToString() ToString() ToString()

このインスタンスの値を String に変換します。

ToString(Int32, Int32) ToString(Int32, Int32) ToString(Int32, Int32) ToString(Int32, Int32)

このインスタンスの部分文字列の値を String に変換します。

明示的なインターフェイスの実装

ISerializable.GetObjectData(SerializationInfo, StreamingContext) ISerializable.GetObjectData(SerializationInfo, StreamingContext) ISerializable.GetObjectData(SerializationInfo, StreamingContext) ISerializable.GetObjectData(SerializationInfo, StreamingContext)

SerializationInfo オブジェクトに、現在の StringBuilder オブジェクトの逆シリアル化に必要なデータを入力します。

適用対象

こちらもご覧ください