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 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
open System.Text

// Create a StringBuilder that expects to hold 50 characters.
// Initialize the StringBuilder with "ABC".
let sb = StringBuilder("ABC", 50)

// Append three characters (D, E, and F) to the end of the StringBuilder.
sb.Append [| 'D'; 'E'; 'F' |] |> ignore

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

// Display the number of characters in the StringBuilder and its string.
printfn $"{sb.Length} chars: {sb}"

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

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

// Display the number of characters in the StringBuilder and its string.
printfn $"{sb.Length} chars: {sb}"

// 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 представляет строковый объект, значение которого представляет собой изменяемую последовательность символов.

StringBuilder и тип String

Хотя StringBuilder и String оба представляют последовательности символов, они реализуются по-разному. String является неизменяемым типом. То есть каждая операция, которая, как представляется, изменяет String объект, фактически создает новую строку.

Например, вызов String.Concat метода в следующем примере C# может изменить значение строковой переменной с именем value. На самом деле Concat метод возвращает value объект, имеющий другое значение и адрес от value объекта, переданного методу. Обратите внимание, что пример должен быть скомпилирован с помощью параметра компилятора /unsafe .

using System;

public class Example7
{
    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
    let mutable value = "This is the first sentence" + "."
    use start = fixed value
    value <- System.String.Concat(value, "This is the second sentence. ")
    use current = fixed value
    printfn $"{start = current}"
// The example displays the following output:
//      False

Для подпрограмм, выполняющих обширные операции со строками (например, приложения, которые изменяют строку много раз в цикле), изменение строки многократно может оказать значительное снижение производительности. Альтернативой является использование StringBuilder, которое является мутируемым классом строки. Мутируемость означает, что после создания экземпляра класса его можно изменить путем добавления, удаления, замены или вставки символов.

Important

StringBuilder Хотя StringBuilder класс, как правило, обеспечивает лучшую производительность, чем String класс, вы не должны автоматически заменять StringBuilder на всякий раз, когда нужно работать со строками. Производительность зависит от размера строки, объема памяти, выделенного для новой строки, системы, в которой выполняется код, и типа операции. Необходимо подготовиться к тестированию кода, чтобы определить, предлагает ли StringBuilder фактически значительное улучшение производительности.

Рекомендуется использовать String класс в следующих условиях:

  • Если количество изменений, которые ваш код вносит в строку, будет небольшим. В таких случаях StringBuilder может предложить незначительное или отсутствие улучшения производительности по сравнению с String.
  • При выполнении фиксированного количества операций объединения, особенно с строковыми литералами. В этом случае компилятор может объединить операции объединения в одну операцию.
  • При выполнении обширных операций поиска при формировании строки. Класс StringBuilder не имеет таких методов поиска, как IndexOf или StartsWith. Вам придется преобразовать объект StringBuilder в String для этих операций, и это может свести на нет преимущества производительности от использования StringBuilder. Дополнительные сведения см. в разделе "Поиск текста в объекте StringBuilder".

Рекомендуется использовать StringBuilder класс в следующих условиях:

  • Если вы ожидаете, что код будет вносить неизвестные изменения в строку во время разработки (например, при использовании цикла для объединения случайного числа строк, содержащих входные данные пользователя).
  • Если вы ожидаете, что код будет вносить значительные изменения в строку.

Как работает StringBuilder

Свойство StringBuilder.Length указывает количество символов, StringBuilder содержащих объект в данный момент. Если вы добавляете символы в StringBuilder объект, его длина увеличивается до тех пор, пока не будет равен размеру StringBuilder.Capacity свойства, которое определяет количество символов, которые может содержать объект. Если количество добавленных символов приводит к превышению длины StringBuilder объекта, выделена новая память, значение Capacity свойства удвоится, новые символы добавляются в StringBuilder объект, а его Length свойство корректируется. Дополнительная память для StringBuilder объекта выделяется динамически, пока она не достигнет значения, определенного свойством StringBuilder.MaxCapacity . При достижении максимальной емкости для объекта StringBuilder, дополнительная память не может быть выделена, и попытка добавить символы или расширить его за пределы максимальной емкости вызывает исключение ArgumentOutOfRangeException или OutOfMemoryException.

В следующем примере показано, как StringBuilder объект выделяет новую память и динамически увеличивает емкость по мере расширения строки, назначенной объекту. Код создает StringBuilder объект, вызывая конструктор по умолчанию (без параметров). Емкость этого объекта по умолчанию составляет 16 символов, а ее максимальная емкость составляет более 2 миллиардов символов. Добавление строки "Это предложение" приводит к новому выделению памяти, так как длина строки (19 символов) превышает емкость StringBuilder объекта по умолчанию. Емкость объекта удваивается до 32 символов, добавляется новая строка, а длина объекта теперь равна 19 символам. Затем код добавляет строку "Это дополнительное предложение" к значению StringBuilder объекта 11 раз. Всякий раз, когда операция добавления приводит к превышению длины StringBuilder объекта, ее существующая емкость удваивается и Append операция завершается успешно.

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

public class Example4
{
    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
open System.Text

let showSBInfo (sb: StringBuilder) =
    for prop in sb.GetType().GetProperties() do
        if prop.GetIndexParameters().Length = 0 then
            printf $"{prop.Name}: {prop.GetValue sb:N0}    "

    printfn ""

let sb = StringBuilder()
showSBInfo sb
sb.Append "This is a sentence." |> ignore
showSBInfo sb

for i = 0 to 10 do
    sb.Append "This is an additional sentence." |> ignore
    showSBInfo sb

// 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 Example5
    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

Выделение памяти

Емкость объекта по умолчанию составляет 16 символов, а максимальная емкость по умолчанию StringBuilderInt32.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 объекта, скорее всего, будет значительно увеличиваться, превышая обычно несколько мегабайт. В этом случае может быть некоторое преимущество производительности при установке начального Capacity свойства на значительно большое значение, чтобы устранить необходимость в слишком большом количестве перемещений памяти.
  • Если код выполняется в системе с ограниченным объемом памяти. В этом случае вы можете установить для свойства MaxCapacity значение меньше Int32.MaxValue, если ваш код обрабатывает большие строки, что может привести к его выполнению в условиях ограниченной памяти.

Создание экземпляра объекта StringBuilder

Создайте экземпляр объекта StringBuilder вызовом одного из шести перегруженных конструкторов класса, перечисленных в следующей таблице. Три конструктора создают StringBuilder экземпляр объекта, значение которого является пустой строкой, но задает его Capacity и MaxCapacity значения по-разному. Остальные три конструктора определяют StringBuilder объект, имеющий определенное строковое значение и емкость. Два из трех конструкторов используют максимальную емкость Int32.MaxValueпо умолчанию, в то время как третья позволяет задать максимальную емкость.

Конструктор Строковое значение Capacity Максимальная вместимость
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в зависимости от того, что больше. Int32.MaxValue

В следующем примере для создания экземпляров StringBuilder объектов используется три из этих перегрузк конструкторов.

using System;
using System.Text;

public class Example8
{
    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: {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
open System.Text

let showSBInfo (sb: StringBuilder) =
    for prop in sb.GetType().GetProperties() do
        if prop.GetIndexParameters().Length = 0 then
            printf $"{prop.Name}: {prop.GetValue sb:N0}    "

    printfn ""

let value = "An ordinary string"
let index = value.IndexOf "An " + 3
let capacity = 0xFFFF

// Instantiate a StringBuilder from a string.
let sb1 = StringBuilder value
showSBInfo sb1

// Instantiate a StringBuilder from string and define a capacity.
let sb2 = StringBuilder(value, capacity)
showSBInfo sb2

// Instantiate a StringBuilder from substring and define a capacity.
let sb3 = StringBuilder(value, index, value.Length - index, capacity)
showSBInfo sb3

// 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 Example8
    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 методы двумя способами:

  • Можно вызывать отдельные методы и игнорировать возвращаемое значение, как показано в следующем примере.

    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.
    
    open System.Text
    
    let sb = StringBuilder()
    sb.Append "This is the beginning of a sentence, " |> ignore
    sb.Replace("the beginning of ", "") |> ignore
    sb.Insert((string sb).IndexOf "a " + 2, "complete ") |> ignore
    sb.Replace(",", ".") |> ignore
    printfn $"{sb}"
    // The example displays the following output:
    //        This is a complete sentence.
    
    Imports System.Text
    
    Module Example2
        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.
    
  • Можно выполнять ряд вызовов методов в одной инструкции. Это может быть удобно, если вы хотите написать одну инструкцию, которая объединяет последовательные операции. Следующий пример объединяет три вызова метода из предыдущего примера в одну строку кода.

    using System;
    using System.Text;
    
    public class Example2
    {
        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.
    
    open System.Text
    
    let sb = StringBuilder "This is the beginning of a sentence, "
    
    sb
        .Replace("the beginning of ", "")
        .Insert((string sb).IndexOf "a " + 2, "complete ")
        .Replace(",", ".")
    |> ignore
    
    printfn $"{sb}"
    // The example displays the following output:
    //        This is a complete sentence.
    
    Imports System.Text
    
    Module Example3
        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[Int32]. Символы в объекте StringBuilder начинаются с индекса 0 (ноль) и продолжаются до индекса Length - 1.

В следующем примере показано свойство Chars[Int32]. Он добавляет десять случайных чисел к объекту StringBuilder , а затем выполняет итерацию каждого символа. Если категория Юникода символа равна UnicodeCategory.DecimalDigitNumber, она уменьшает число на единицу (или изменяет его на 9, если его значение равно 0). В примере отображается содержимое StringBuilder объекта до и после изменения значений отдельных символов.

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

public class Example3
{
    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
open System
open System.Globalization
open System.Text

let rnd = Random()
let sb = new StringBuilder()

// Generate 10 random numbers and store them in a StringBuilder.
for _ = 0 to 9 do
    rnd.Next().ToString "N5" |> sb.Append |> ignore

printfn "The original string:"
printfn $"{sb}"

// Decrease each number by one.
for i = 0 to sb.Length - 1 do
    if Char.GetUnicodeCategory(sb[i]) = UnicodeCategory.DecimalDigitNumber then
        let number = Char.GetNumericValue sb.[i] |> int
        let number = number - 1
        let number = if number < 0 then 9 else number
        sb.[i] <- number.ToString()[0]

printfn "\nThe new string:"
printfn $"{sb}"

// 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 Example4
    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, использование свойства Chars[] для доступа на основе индекса к одному или небольшому числу символов оказывает незначительное воздействие на производительность; как правило, это операция O(n). Производительность серьезно снижается во время итерации символов в объекте StringBuilder — операция O(n^2).

Если возникают проблемы с производительностью при использовании символьного индексирования с объектами StringBuilder, попробуйте выполнить одно из следующих действий:

  • Преобразуйте экземпляр StringBuilder в String путем вызова метода ToString, а затем получите доступ к символам в строке.

  • Скопируйте содержимое существующего объекта 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 значение, примерно равное максимальному ожидаемому размеру, путем вызова конструктора StringBuilder(Int32). Имейте в виду, что будет выделен целый блок памяти, даже если StringBuilder редко достигает своего максимального размера.

Добавление текста в объект StringBuilder

Класс StringBuilder включает следующие методы для расширения содержимого StringBuilder объекта:

  • Метод Append добавляет строку, подстроку, массив символов, часть массива символов, один символ повторяющийся несколько раз или строковое представление примитивного типа данных к объекту StringBuilder .

  • Метод AppendLine добавляет к объекту StringBuilder символ конца строки или строку, дополненную символом конца строки.

  • Метод AppendFormat добавляет строку составного формата к объекту StringBuilder . Строковые представления объектов, включенных в результирующую строку, могут отражать форматирование текущей системной культуры или определенной культуры.

  • Метод Insert вставляет строку, подстроку, несколько повторений строки, массив символов, часть массива символов или строковое представление примитивного типа данных по заданной позиции в объекте StringBuilder . Позиция определяется отсчитываемым от нуля индексом.

В следующем примере используются методы Append, AppendLine, AppendFormat и Insert для расширения текста объекта StringBuilder.

using System;
using System.Text;

public class Example6
{
    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, $"{Environment.NewLine}{"Code Unit",12} {"Character",12}{Environment.NewLine}");

        // 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            <
open System
open System.Text

// Create a StringBuilder object with no text.
let sb = StringBuilder()
// Append some text.
sb
    .Append('*', 10)
    .Append(" Adding Text to a StringBuilder Object ")
    .Append('*', 10)
|> ignore

sb.AppendLine "\n" |> ignore
sb.AppendLine "Some code points and their corresponding characters:" |> ignore
// Append some formatted text.
for i = 50 to 60 do
    sb.AppendFormat("{0,12:X4} {1,12}", i, Convert.ToChar i) |> ignore
    sb.AppendLine() |> ignore

// Find the end of the introduction to the column.
let pos = (string sb).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"))
|> ignore

// Convert the StringBuilder to a string and display it.
printfn $"{sb}"


// 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 Example7
    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} {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 значение. Метод Remove удаляет указанное число символов, начиная с определенной позиции индекса. Кроме того, можно удалить символы из конца StringBuilder объекта, задав его Length свойство значением, которое меньше длины текущего экземпляра.

В следующем примере удаляется часть текста из StringBuilder объекта, отображается итоговая емкость, максимальная емкость и значения свойств длины, а затем вызывается Clear метод для удаления всех символов из StringBuilder объекта.

using System;
using System.Text;

public class Example5
{
    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: {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
open System.Text

let showSBInfo (sb: StringBuilder) =
    for prop in sb.GetType().GetProperties() do
        if prop.GetIndexParameters().Length = 0 then
            printf $"{prop.Name}: {prop.GetValue sb:N0}    "

    printfn ""

let sb = StringBuilder "A StringBuilder object"
showSBInfo sb
// Remove "object" from the text.
let textToRemove = "object"
let pos = (string sb).IndexOf textToRemove

if pos >= 0 then
    sb.Remove(pos, textToRemove.Length) |> ignore
    showSBInfo sb

// Clear the StringBuilder contents.
sb.Clear() |> ignore
showSBInfo sb

// 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 Example6
    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 Then
            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 Example13
{
    public static void Main()
    {
        StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
        MyStringBuilder.Replace('!', '?');
        Console.WriteLine(MyStringBuilder);
    }
}
// The example displays the following output:
//       Hello World?
open System.Text

let myStringBuilder = StringBuilder "Hello World!"
myStringBuilder.Replace('!', '?') |> ignore
printfn $"{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 было найдено с помощью метода поиска по строке или метода регулярного выражения. Существует четыре способа реализации таких поисковых запросов, как показано в следующей таблице.

Technique Pros Cons
Выполните поиск строковых значений перед добавлением их в StringBuilder объект. Полезно определить, существует ли подстрока. Невозможно использовать, если положение индекса подстроки важно.
Вызов ToString и поиск возвращаемого String объекта. Легко использовать, если назначить весь текст StringBuilder объекту, а затем начать изменять его. Обременительно многократно вызывать ToString, если необходимо внести изменения перед добавлением всего текста в объект StringBuilder.

Если вы вносите изменения, следует помнить, что работать нужно с конца StringBuilder текста объекта.
Chars[Int32] Используйте свойство для последовательного поиска диапазона символов. Полезно, если вы обеспокоены отдельными символами или небольшой подстрокой. Громоздким, если количество символов для поиска большое или если логика поиска сложна.

В результате крайне низкая производительность наблюдается у объектов, которые чрезвычайно увеличились из-за повторяющихся вызовов методов.
Преобразуйте объект в StringBuilderString объект и выполните изменения в объекте String . Полезно, если количество изменений невелико. Нивелирует преимущество в производительности класса StringBuilder, если количество изменений велико.

Давайте рассмотрим эти методы более подробно.

  • Если цель поиска заключается в том, чтобы определить, существует ли определенная подстрока (то есть, если вы не заинтересованы в позиции подстроки), можно выполнять поиск строк перед их хранением в объекте StringBuilder . В следующем примере представлена одна возможная реализация. Он определяет StringBuilderFinder класс, конструктор которого передает ссылку на StringBuilder объект и подстроку для поиска в строке. В этом случае пример пытается определить, находятся ли записанные температуры в Фаренгейтах или Цельсиях, и добавляет соответствующий вводный текст в начало StringBuilder объекта. Генератор случайных чисел используется для выбора массива, содержащего данные в градусах цельсия или градусах Фаренгейта.

    using System;
    using System.Text;
    
    public class Example9
    {
        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
    
    open System
    open System.Text
    
    type StringBuilderFinder(sb: StringBuilder, textToFind: string) =
        member _.SearchAndAppend(stringToSearch: string) =
            sb.Append stringToSearch |> ignore
            stringToSearch.Contains textToFind
    
    let tempF = [| "47.6F"; "51.3F"; "49.5F"; "62.3F" |]
    let tempC = [| "21.2C"; "16.1C"; "23.5C"; "22.9C" |]
    let temps = [| tempF; tempC |]
    
    let sb = StringBuilder()
    let f = StringBuilderFinder(sb, "F")
    let temperatures = temps[Random.Shared.Next(2)]
    let mutable baseDate = DateTime(2013, 5, 1)
    let mutable isFahrenheit = false
    
    for temperature in temperatures do
        if isFahrenheit then
            sb.AppendFormat("{0:d}: {1}\n", baseDate, temperature) |> ignore
        else
            isFahrenheit <- $"{baseDate:d}: {temperature}\n" |> f.SearchAndAppend
    
        baseDate <- baseDate.AddDays 1
    
    if isFahrenheit then
        sb.Insert(0, "Average Daily Temperature in Degrees Fahrenheit") |> ignore
        sb.Insert(47, "\n\n") |> ignore
    
    else
        sb.Insert(0, "Average Daily Temperature in Degrees Celsius") |> ignore
        sb.Insert(44, "\n\n") |> ignore
    
    printfn $"{sb}"
    
    // 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 Example9
        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 объект в строку.

    Этот подход показан в приведенном ниже примере. Он хранит в объекте StringBuilder четыре экземпляра каждой буквы английского алфавита. Затем он преобразует текст String в объект и использует регулярное выражение для идентификации начальной позиции каждой четырехзначной последовательности. Наконец, он добавляет подчеркивание перед каждой четырехзначной последовательностью, за исключением первой последовательности, и преобразует первый символ последовательности в верхний регистр.

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public class Example10
    {
        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
    
    open System
    open System.Text
    open System.Text.RegularExpressions
    
    // Create a StringBuilder object with 4 successive occurrences
    // of each character in the English alphabet.
    let sb = StringBuilder()
    
    for char in 'a' .. 'z' do
        sb.Append(char, 4) |> ignore
    
    // Create a parallel string object.
    let sbString = string sb
    // Determine where each new character sequence begins.
    let pattern = @"(\w)\1+"
    let matches = Regex.Matches(sbString, pattern)
    
    // Uppercase the first occurrence of the sequence, and separate it
    // from the previous sequence by an underscore character.
    for i = matches.Count - 1 downto 0 do
        let m = matches[i]
        sb[m.Index] <- Char.ToUpper sb[m.Index]
    
        if m.Index > 0 then
            sb.Insert(m.Index, "_") |> ignore
    
    // Display the resulting string.
    let sbString2 = string sb
    
    for line = 0 to (sbString2.Length - 1) / 80 do
        let nChars =
            if line * 80 + 79 <= sbString2.Length then
                80
            else
                sbString2.Length - line * 80
    
        printfn $"{sbString2.Substring(line * 80, nChars)}"
    
    
    // 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 Example10
        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[Int32] свойство для обнаружения изменения значения символа, вставки подчеркивания в эту позицию и преобразования первого символа в новой последовательности в верхний регистр.

    using System;
    using System.Text;
    
    public class Example11
    {
        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
    
    open System
    open System.Text
    
    // Create a StringBuilder object with 4 successive occurrences
    // of each character in the English alphabet.
    let sb = StringBuilder()
    
    for char in 'a' .. 'z' do
        sb.Append(char, 4) |> ignore
    
    // Iterate the text to determine when a new character sequence occurs.
    let mutable position = 0
    let mutable current = '\u0000'
    
    while position <= sb.Length - 1 do
        if sb[position] <> current then
            current <- sb[position]
            sb[position] <- Char.ToUpper sb[position]
    
            if position > 0 then
                sb.Insert(position, "_") |> ignore
    
            position <- position + 2
    
        else
            position <- position + 1
    
    // Display the resulting string.
    let sbString = string sb
    
    for line = 0 to (sbString.Length - 1) / 80 do
        let nChars =
            if line * 80 + 79 <= sbString.Length then
                80
            else
                sbString.Length - line * 80
    
        printfn $"{sbString.Substring(line * 80, nChars)}"
    
    // 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 Example11
        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 объекта.

    Следующий пример идентичен функциям предыдущих двух примеров, но отличается в реализации. Он создает StringBuilder объект, преобразует его в String объект, а затем использует регулярное выражение для выполнения всех оставшихся изменений в строке. Метод Regex.Replace(String, String, MatchEvaluator) использует лямбда-выражение для выполнения замены в каждом совпадении.

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public class Example12
    {
        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
    
    open System.Text
    open System.Text.RegularExpressions
    
    // Create a StringBuilder object with 4 successive occurrences
    // of each character in the English alphabet.
    let sb = StringBuilder()
    
    for char in 'a' .. 'z' do
        sb.Append(char, 4) |> ignore
    
    // Convert it to a string.
    let sbString = string sb
    
    // Use a regex to uppercase the first occurrence of the sequence,
    // and separate it from the previous sequence by an underscore.
    let pattern = @"(\w)(\1+)"
    
    let sbStringReplaced =
        Regex.Replace(
            sbString,
            pattern,
            fun m ->
                (if m.Index > 0 then "_" else "")
                + m.Groups[ 1 ].Value.ToUpper()
                + m.Groups[2].Value
        )
    
    // Display the resulting string.
    for line = 0 to (sbStringReplaced.Length - 1) / 80 do
        let nChars =
            if line * 80 + 79 <= sbStringReplaced.Length then
                80
            else
                sbStringReplaced.Length - line * 80
    
        printfn $"{sbStringReplaced.Substring(line * 80, nChars)}"
    
    // 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 Example12
        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, Int32)

Инициализирует новый экземпляр класса, который начинается с указанной StringBuilder емкости и может увеличиваться до указанного максимума.

StringBuilder(Int32)

Инициализирует новый экземпляр класса с помощью указанной StringBuilder емкости.

StringBuilder(String, Int32, Int32, Int32)

Инициализирует новый экземпляр класса из указанной StringBuilder подстроки и емкости.

StringBuilder(String, Int32)

Инициализирует новый экземпляр класса с помощью указанной StringBuilder строки и емкости.

StringBuilder(String)

Инициализирует новый экземпляр класса с помощью указанной StringBuilder строки.

Свойства

Имя Описание
Capacity

Возвращает или задает максимальное количество символов, которые могут содержаться в памяти, выделенной текущим экземпляром.

Chars[Int32]

Возвращает или задает символ в указанной позиции символа в этом экземпляре.

Length

Возвращает или задает длину текущего StringBuilder объекта.

MaxCapacity

Получает максимальную емкость этого экземпляра.

Методы

Имя Описание
Append(Boolean)

Добавляет строковое представление указанного логического значения в этот экземпляр.

Append(Byte)

Добавляет строковое представление указанного 8-разрядного целого числа без знака в этот экземпляр.

Append(Char, Int32)

Добавляет указанное количество копий строкового представления символа Юникода к этому экземпляру.

Append(Char)

Добавляет строковое представление указанного Char объекта к этому экземпляру.

Append(Char[], Int32, Int32)

Добавляет строковое представление указанного подаррейства символов Юникода к этому экземпляру.

Append(Char[])

Добавляет строковое представление символов Юникода в указанном массиве к этому экземпляру.

Append(Char*, Int32)

Добавляет массив символов Юникода, начиная с указанного адреса в этот экземпляр.

Append(Decimal)

Добавляет строковое представление указанного десятичного числа в этот экземпляр.

Append(Double)

Добавляет строковое представление указанного числа с плавающей запятой двойной точности к этому экземпляру.

Append(IFormatProvider, StringBuilder+AppendInterpolatedStringHandler)

Добавляет указанную интерполированную строку в этот экземпляр с помощью указанного формата.

Append(Int16)

Добавляет строковое представление указанного 16-разрядного целого числа со знаком в этот экземпляр.

Append(Int32)

Добавляет строковое представление указанного 32-разрядного целого числа со знаком к этому экземпляру.

Append(Int64)

Добавляет строковое представление указанного 64-разрядного целого числа со знаком в этот экземпляр.

Append(Object)

Добавляет строковое представление указанного объекта к этому экземпляру.

Append(ReadOnlyMemory<Char>)

Добавляет строковое представление указанной области памяти только для чтения в этот экземпляр.

Append(ReadOnlySpan<Char>)

Добавляет строковое представление указанного диапазона символов только для чтения в этот экземпляр.

Append(Rune)

Представляет изменяемую строку символов. Этот класс не наследуется.

Append(SByte)

Добавляет строковое представление указанного 8-разрядного целого числа со знаком в этот экземпляр.

Append(Single)

Добавляет строковое представление указанного числа с плавающей запятой с одной точностью к этому экземпляру.

Append(String, Int32, Int32)

Добавляет копию указанной подстроки к этому экземпляру.

Append(String)

Добавляет копию указанной строки в этот экземпляр.

Append(StringBuilder, Int32, Int32)

Добавляет копию подстроки в указанный построитель строк в этот экземпляр.

Append(StringBuilder)

Добавляет строковое представление указанного построителя строк в этот экземпляр.

Append(StringBuilder+AppendInterpolatedStringHandler)

Добавляет указанную интерполированную строку в этот экземпляр.

Append(UInt16)

Добавляет строковое представление указанного 16-разрядного целого числа без знака к этому экземпляру.

Append(UInt32)

Добавляет строковое представление указанного 32-разрядного целого числа без знака к этому экземпляру.

Append(UInt64)

Добавляет строковое представление указанного 64-разрядного целого числа без знака в этот экземпляр.

AppendFormat(IFormatProvider, CompositeFormat, Object[])

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением любого из аргументов с помощью указанного поставщика формата.

AppendFormat(IFormatProvider, CompositeFormat, ReadOnlySpan<Object>)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением любого из аргументов с помощью указанного поставщика формата.

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

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением любого из трех аргументов с помощью указанного поставщика формата.

AppendFormat(IFormatProvider, String, Object, Object)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением одного из двух аргументов с помощью указанного поставщика формата.

AppendFormat(IFormatProvider, String, Object)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением одного аргумента с помощью указанного поставщика формата.

AppendFormat(IFormatProvider, String, Object[])

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением соответствующего аргумента в массиве параметров с помощью указанного поставщика формата.

AppendFormat(IFormatProvider, String, ReadOnlySpan<Object>)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением соответствующего аргумента в диапазоне параметров с помощью указанного поставщика формата.

AppendFormat(String, Object, Object, Object)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением любого из трех аргументов.

AppendFormat(String, Object, Object)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением одного из двух аргументов.

AppendFormat(String, Object)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением одного аргумента.

AppendFormat(String, Object[])

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением соответствующего аргумента в массиве параметров.

AppendFormat(String, ReadOnlySpan<Object>)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением соответствующего аргумента в диапазоне параметров.

AppendFormat<TArg0,TArg1,TArg2>(IFormatProvider, CompositeFormat, TArg0, TArg1, TArg2)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением любого из аргументов с помощью указанного поставщика формата.

AppendFormat<TArg0,TArg1>(IFormatProvider, CompositeFormat, TArg0, TArg1)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением любого из аргументов с помощью указанного поставщика формата.

AppendFormat<TArg0>(IFormatProvider, CompositeFormat, TArg0)

Добавляет строку, возвращаемую путем обработки составной строки форматирования, содержащей к этому экземпляру ноль или больше элементов формата. Каждый элемент формата заменяется строковым представлением любого из аргументов с помощью указанного поставщика формата.

AppendJoin(Char, Object[])

Объединяет строковые представления элементов в предоставленном массиве объектов, используя указанный разделитель символов между каждым элементом, а затем добавляет результат к текущему экземпляру построителя строк.

AppendJoin(Char, ReadOnlySpan<Object>)

Объединяет строковые представления элементов в предоставленном диапазоне объектов, используя указанный разделитель символов между каждым элементом, а затем добавляет результат к текущему экземпляру построителя строк.

AppendJoin(Char, ReadOnlySpan<String>)

Объединяет строки предоставленного диапазона, используя указанный разделитель символов между каждой строкой, а затем добавляет результат к текущему экземпляру построителя строк.

AppendJoin(Char, String[])

Объединяет строки предоставленного массива, используя указанный разделитель символов между каждой строкой, а затем добавляет результат к текущему экземпляру построителя строк.

AppendJoin(String, Object[])

Объединяет строковые представления элементов в предоставленном массиве объектов, используя указанный разделитель между каждым элементом, а затем добавляет результат к текущему экземпляру построителя строк.

AppendJoin(String, ReadOnlySpan<Object>)

Объединяет строковые представления элементов в предоставленном диапазоне объектов, используя указанный разделитель между каждым элементом, а затем добавляет результат к текущему экземпляру построителя строк.

AppendJoin(String, ReadOnlySpan<String>)

Объединяет строки предоставленного диапазона, используя указанный разделитель между каждой строкой, а затем добавляет результат к текущему экземпляру построителя строк.

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 не менее указанного значения.

EnumerateRunes()

Представляет изменяемую строку символов. Этот класс не наследуется.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
Equals(ReadOnlySpan<Char>)

Возвращает значение, указывающее, равны ли символы в этом экземпляре символам в указанном диапазоне символов только для чтения.

Equals(StringBuilder)

Возвращает значение, указывающее, равен ли этот экземпляр указанному объекту.

GetChunks()

Возвращает объект, который можно использовать для итерации фрагментов символов, представленных в созданном ReadOnlyMemory<Char> из этого StringBuilder экземпляра.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetRuneAt(Int32)

Представляет изменяемую строку символов. Этот класс не наследуется.

GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
Insert(Int32, Boolean)

Вставляет строковое представление логического значения в этот экземпляр по указанной позиции символа.

Insert(Int32, Byte)

Вставляет строковое представление указанного 8-разрядного целого числа без знака в этот экземпляр в указанной позиции символа.

Insert(Int32, Char)

Вставляет строковое представление указанного символа Юникода в этот экземпляр в указанной позиции символа.

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

Вставляет строковое представление указанных вложенных символов Юникода в этот экземпляр по указанной позиции символов.

Insert(Int32, Char[])

Вставляет строковое представление указанного массива символов Юникода в этот экземпляр по указанной позиции символов.

Insert(Int32, Decimal)

Вставляет строковое представление десятичного числа в этот экземпляр в указанной позиции символа.

Insert(Int32, Double)

Вставляет строковое представление числа с плавающей запятой двойной точности в этот экземпляр в указанной позиции символа.

Insert(Int32, Int16)

Вставляет строковое представление указанного 16-разрядного целого числа со знаком в этот экземпляр по указанной позиции символа.

Insert(Int32, Int32)

Вставляет строковое представление указанного 32-разрядного целого числа со знаком в этот экземпляр в указанной позиции символа.

Insert(Int32, Int64)

Вставляет строковое представление 64-разрядного целого числа со знаком в этот экземпляр в указанной позиции символа.

Insert(Int32, Object)

Вставляет строковое представление объекта в этот экземпляр по указанной позиции символа.

Insert(Int32, ReadOnlySpan<Char>)

Вставляет последовательность символов в этот экземпляр по указанному расположению символов.

Insert(Int32, Rune)

Представляет изменяемую строку символов. Этот класс не наследуется.

Insert(Int32, SByte)

Вставляет строковое представление указанного 8-разрядного целого числа со знаком в этот экземпляр в указанной позиции символа.

Insert(Int32, Single)

Вставляет строковое представление числа с плавающей запятой с одной точностью в этот экземпляр в указанной позиции символа.

Insert(Int32, String, Int32)

Вставляет одну или несколько копий указанной строки в этот экземпляр в указанной позиции символа.

Insert(Int32, String)

Вставляет строку в этот экземпляр в указанное положение символов.

Insert(Int32, UInt16)

Вставляет строковое представление 16-разрядного целого числа без знака в этот экземпляр в указанной позиции символа.

Insert(Int32, UInt32)

Вставляет строковое представление 32-разрядного целого числа без знака в этот экземпляр в указанной позиции символа.

Insert(Int32, UInt64)

Вставляет строковое представление 64-разрядного целого числа без знака в этот экземпляр в указанной позиции символа.

MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
MoveChunks(StringBuilder)

Представляет изменяемую строку символов. Этот класс не наследуется.

Remove(Int32, Int32)

Удаляет указанный диапазон символов из этого экземпляра.

Replace(Char, Char, Int32, Int32)

Заменяет в подстроку этого экземпляра все вхождения указанного символа другим заданным символом.

Replace(Char, Char)

Заменяет все вхождения указанного символа в этом экземпляре другим указанным символом.

Replace(ReadOnlySpan<Char>, ReadOnlySpan<Char>, Int32, Int32)

Заменяет все экземпляры одного диапазона символов только для чтения другим в составе этого построителя.

Replace(ReadOnlySpan<Char>, ReadOnlySpan<Char>)

Заменяет все экземпляры одного диапазона символов только для чтения другим в этом построителе.

Replace(Rune, Rune, Int32, Int32)

Представляет изменяемую строку символов. Этот класс не наследуется.

Replace(Rune, Rune)

Представляет изменяемую строку символов. Этот класс не наследуется.

Replace(String, String, Int32, Int32)

Заменяет в подстроке этого экземпляра все вхождения указанной строки другой указанной строкой.

Replace(String, String)

Заменяет все вхождения указанной строки в этом экземпляре другой указанной строкой.

ToString()

Преобразует значение этого экземпляра в .String

ToString(Int32, Int32)

Преобразует значение подстроки этого экземпляра в .String

TryGetRuneAt(Int32, Rune)

Представляет изменяемую строку символов. Этот класс не наследуется.

Явные реализации интерфейса

Имя Описание
ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Заполняет SerializationInfo объект данными, необходимыми для десериализации текущего StringBuilder объекта.

Методы расширения

Имя Описание
Append(StringBuilder, StringSegment)

Добавляет заданный StringSegmentStringBuilderобъект.

Применяется к

См. также раздел