StringBuilder クラス

定義

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

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

クラスで定義されている多くのメソッドを呼び出す方法を次の例に示し 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

注釈

このクラスは、値が変更可能な一連の文字である文字列に似たオブジェクトを表します。

このセクションの内容は次のとおりです。

String 型と StringBuilder 型

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

たとえば、次の C# の例のメソッドを呼び出すと、 String.Concat という名前の文字列変数の値が変更され 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 。 変更可能性とは、クラスのインスタンスが作成された後に、そのインスタンスを追加、削除、置換、または挿入することによって変更できることを意味します。 オブジェクトは、 StringBuilder 文字列への展開に対応するためのバッファーを保持します。 空き領域がある場合は、新しいデータがバッファーに追加されます。それ以外の場合は、新しい大きなバッファーが割り当てられ、元のバッファーのデータが新しいバッファーにコピーされます。その後、新しいデータが新しいバッファーに追加されます。

重要

クラスは StringBuilder 一般にクラスより優れたパフォーマンス String を提供しますが、文字列を操作するときは常にを自動的に置き換えないようにしてください String StringBuilder 。 パフォーマンスは、文字列のサイズ、新しい文字列に割り当てられるメモリの量、コードが実行されているシステム、および操作の種類によって異なります。 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 a 文." という文字列を追加します。 文字列の長さ (19 文字) がオブジェクトの既定の容量を超えているため、新しいメモリが割り当てら StringBuilder れます。 オブジェクトの容量が2倍32になると、新しい文字列が追加され、オブジェクトの長さは19文字になります。 このコードでは、"This は追加の文です。" という文字列を追加します。 オブジェクトの値を 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 プロパティで定義されている値まで倍増し MaxCapacity ます。

一般に、既定の容量と最大容量は、ほとんどのアプリに適しています。 次の条件に該当する場合は、これらの値を設定することを検討してください。

  • オブジェクトの最終的 StringBuilder なサイズが非常に大きくなる可能性が高い場合、通常は数 mb を超えています。 この場合、初期 Capacity プロパティを非常に大きな値に設定することによって、メモリ再割り当てが過剰にならないようにすると、パフォーマンスが向上する場合があります。

  • メモリが制限されているシステムでコードを実行している場合。 この場合は、 MaxCapacity Int32.MaxValue メモリの制約がある環境で実行される可能性のある大きな文字列をコードが処理する場合よりも、プロパティをより小さく設定することを検討してください。

StringBuilder オブジェクトのインスタンス化

StringBuilder次の表に示すように、6つのオーバーロードされたクラスコンストラクターのいずれかを呼び出すことによって、オブジェクトをインスタンス化します。 3つのコンストラクターは、 StringBuilder 値が空の文字列であるオブジェクトをインスタンス化しますが、 Capacity との値を異なる方法で設定し MaxCapacity ます。 残りの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または valueLength、いずれか大きい方 Int32.MaxValue
StringBuilder(String, Int32) パラメーターによって定義されます。 value パラメーターまたはによって定義され capacity value ます。 Lengthのいずれか大きい方。 Int32.MaxValue
StringBuilder(String, Int32, Int32, Int32) value によって定義されます。 Substring(startIndex, length) パラメーターまたはによって定義され capacity value ます。 Lengthのいずれか大きい方。 Int32.MaxValue

次の例では、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つのステートメントで一連のメソッド呼び出しを行うことができます。 これは、連続する操作を連結する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[] ます。 C# で Chars[] は、はインデクサーです。 Visual Basic では、クラスの既定のプロパティです StringBuilder 。 これにより、プロパティを明示的に参照せずに、インデックスのみを使用して個々の文字を設定または取得でき Chars[] ます。 オブジェクト内の文字は、 StringBuilder インデックス 0 (ゼロ) から始まり、インデックス Length 1 に続きます。

次の例は、プロパティを示してい Chars[] ます。 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[] プロパティで文字ベースのインデックス付けを使用すると、次の条件下では非常に遅くなることがあります。

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

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

注意

大きな "チャンク化" した StringBuilder オブジェクトの場合でも、1 つまたは少数の文字へのインデックス ベースのアクセスに Chars[] プロパティを使うと、パフォーマンスへの影響はごくわずかです。通常、これは 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から始まるインデックスによって定義されます。

次の例では、、、、およびの各メソッドを使用して、 Append AppendLine AppendFormat 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.Contains String.IndexOf String.StartsWith String オブジェクトで特定の文字または部分文字列を検索できます。 部分文字列の存在または開始文字の位置を特定するには、 String 文字列検索メソッドまたは正規表現メソッドを使用して値を検索する必要があります。 このような検索を実装するには、次の表に示すように4つの方法があります。

手法 長所 短所
文字列値をオブジェクトに追加する前に検索 StringBuilder します。 部分文字列が存在するかどうかを判断する場合に便利です。 は、部分文字列のインデックス位置が重要な場合は使用できません。
ToStringを呼び出し、返されたオブジェクトを検索し String ます。 すべてのテキストをオブジェクトに割り当て StringBuilder てから変更を開始すると、使いやすくなります。 ToStringすべてのテキストがオブジェクトに追加される前に変更を行う必要がある場合は、を繰り返し呼び出すのは面倒 StringBuilder です。

StringBuilder変更を行っている場合は、オブジェクトのテキストの末尾から作業する必要があります。
プロパティを使用して、 Chars[] 文字の範囲を順番に検索します。 個々の文字または小さい部分文字列に関心がある場合に便利です。 検索する文字数が多い場合、または検索ロジックが複雑な場合には煩雑です。

メソッドの呼び出しを繰り返すことによって非常に大きな増加したオブジェクトのパフォーマンスが非常に低下します。
オブジェクトをオブジェクトに変換し、オブジェクト 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 ます。 StringBuilderとの両方 String のオブジェクトは、文字を格納するために 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[] オブジェクト内の文字の範囲を順番に検索し StringBuilder ます。 検索対象の文字数が多い場合や検索ロジックが特に複雑な場合、この方法は実用的ではない可能性があります。 非常に大きなチャンクを持つオブジェクトに対する文字単位のインデックスベースのアクセスによるパフォーマンスへの影響については、 StringBuilder プロパティのドキュメントを参照してください StringBuilder.Chars[]

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

    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
    
  • 未変更のテキストをすべてオブジェクトに格納し StringBuilderStringBuilder.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(Int32)

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

StringBuilder(Int32, Int32)

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

StringBuilder(String)

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

StringBuilder(String, Int32)

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

StringBuilder(String, Int32, Int32, Int32)

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

プロパティ

Capacity

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

Chars[Int32]

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

Length

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

MaxCapacity

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

メソッド

Append(Boolean)

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

Append(Byte)

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

Append(Char)

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

Append(Char*, Int32)

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

Append(Char, Int32)

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

Append(Char[])

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

Append(Char[], Int32, Int32)

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

Append(Decimal)

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

Append(Double)

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

Append(IFormatProvider, StringBuilder+AppendInterpolatedStringHandler)

指定した形式を使用して、指定した挿入文字列をこのインスタンスに追加します。

Append(Int16)

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

Append(Int32)

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

Append(Int64)

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

Append(Object)

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

Append(ReadOnlyMemory<Char>)

指定された読み取り専用文字メモリ領域の文字列形式をこのインスタンスに追加します。

Append(ReadOnlySpan<Char>)

指定された読み取り専用文字スパンの文字列形式をこのインスタンスに追加します。

Append(SByte)

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

Append(Single)

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

Append(String)

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

Append(String, Int32, Int32)

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

Append(StringBuilder)

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

Append(StringBuilder, Int32, Int32)

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

Append(StringBuilder+AppendInterpolatedStringHandler)

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

Append(UInt16)

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

Append(UInt32)

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

Append(UInt64)

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

AppendFormat(IFormatProvider, String, Object)

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

AppendFormat(IFormatProvider, String, Object, Object)

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

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

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

AppendFormat(IFormatProvider, String, Object[])

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

AppendFormat(String, Object)

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

AppendFormat(String, Object, Object)

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

AppendFormat(String, Object, Object, Object)

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

AppendFormat(String, Object[])

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

AppendJoin(Char, Object[])

指定したオブジェクト配列内の要素の文字列表現を連結します。各メンバー間には、指定した区切り文字が使用され、その結果は文字列ビルダーの現在のインスタンスに追加されます。

AppendJoin(Char, String[])

指定した配列の文字列を連結します。各文字列間には、指定した区切り文字が使用され、その結果は文字列ビルダーの現在のインスタンスに追加されます。

AppendJoin(String, Object[])

指定したオブジェクト配列内の要素の文字列表現を連結します。各メンバー間には、指定した区切り記号が使用され、その結果は文字列ビルダーの現在のインスタンスに追加されます。

AppendJoin(String, String[])

指定した配列の文字列を連結します。各文字列間には、指定した区切り記号が使用され、その結果は文字列ビルダーの現在のインスタンスに追加されます。

AppendJoin<T>(Char, IEnumerable<T>)

コレクションのメンバーを連結および追加します。各メンバー間には、指定した区切り文字が使用されます。

AppendJoin<T>(String, IEnumerable<T>)

コレクションのメンバーを連結および追加します。各メンバー間には、指定した区切り記号が使用されます。

AppendLine()

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

AppendLine(IFormatProvider, StringBuilder+AppendInterpolatedStringHandler)

指定した書式を使用して指定した挿入文字列を追加し、その後に既定の行終端記号を追加して、現在の StringBuilder オブジェクトの末尾に追加します。

AppendLine(String)

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

AppendLine(StringBuilder+AppendInterpolatedStringHandler)

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

Clear()

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

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

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

CopyTo(Int32, Span<Char>, Int32)

文字をこのインスタンスの指定したセグメントから目的の Char のスパンにコピーします。

EnsureCapacity(Int32)

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

Equals(Object)

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

(継承元 Object)
Equals(ReadOnlySpan<Char>)

このインスタンスの文字が、指定された読み取り専用の文字範囲内の文字と同じであるかどうかを示す値を返します。

Equals(StringBuilder)

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

GetChunks()

この StringBuilder インスタンスから作成された ReadOnlyMemory<Char> で表される文字のチャンクを反復処理する目的で利用できるオブジェクトを返します。

GetHashCode()

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

(継承元 Object)
GetType()

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

(継承元 Object)
Insert(Int32, Boolean)

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

Insert(Int32, Byte)

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

Insert(Int32, Char)

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

Insert(Int32, Char[])

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

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

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

Insert(Int32, Decimal)

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

Insert(Int32, Double)

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

Insert(Int32, Int16)

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

Insert(Int32, Int32)

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

Insert(Int32, Int64)

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

Insert(Int32, Object)

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

Insert(Int32, ReadOnlySpan<Char>)

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

Insert(Int32, SByte)

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

Insert(Int32, Single)

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

Insert(Int32, String)

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

Insert(Int32, String, Int32)

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

Insert(Int32, UInt16)

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

Insert(Int32, UInt32)

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

Insert(Int32, UInt64)

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

MemberwiseClone()

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

(継承元 Object)
Remove(Int32, Int32)

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

Replace(Char, Char)

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

Replace(Char, Char, Int32, Int32)

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

Replace(String, String)

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

Replace(String, String, Int32, Int32)

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

ToString()

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

ToString(Int32, Int32)

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

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

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

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

適用対象

こちらもご覧ください