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
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
Комментарии
Этот класс представляет строковый объект, значение которого является изменяемой последовательностью символов.
Содержание
Типы String и StringBuilder
Хотя StringBuilder и представляют String последовательности символов, они реализуются по-разному. 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
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класса , который является изменяемым строковым классом. Изменяемость означает, что после создания экземпляра класса его можно изменить путем добавления, удаления, замены или вставки символов. Объект StringBuilder поддерживает буфер для размещения расширений строки. Новые данные добавляются в буфер, если доступно помещение; В противном случае выделяется новый, более крупный буфер, данные из исходного буфера копируются в новый буфер, а затем новые данные добавляются в новый буфер.
Важно!
StringBuilder Хотя класс обычно обеспечивает более высокую производительность, чем String класс , не следует автоматически заменять StringBuilderString на всякий раз, когда вы хотите управлять строками. Производительность зависит от размера строки, объема памяти, выделяемой для новой строки, системы, в которой выполняется код, и типа операции. Вы должны быть готовы к тестированию кода, чтобы определить, обеспечивает ли StringBuilder реальное повышение производительности.
Рассмотрите возможность использования класса в String следующих условиях:
Если количество изменений, внесенных кодом в строку, невелико. В таких случаях StringBuilder может обеспечить незначительное или вообще не улучшить производительность по сравнению с String.
При выполнении фиксированного числа операций объединения, особенно со строковыми литералами. В этом случае компилятор может объединить операции объединения в одну операцию.
При выполнении расширенных операций поиска во время создания строки. В StringBuilder классе отсутствуют методы поиска, такие как
IndexOf
илиStartsWith
. Для этих операций необходимо преобразовать объект String в StringBuilder , и это может свести на нет преимущество производительности от использования 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 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
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 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 всего, увеличится слишком большим, как правило, свыше нескольких мегабайт. В этом случае может быть некоторое преимущество производительности, если присвоить начальному 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 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
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 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 методы двумя способами:
Вы можете выполнять отдельные вызовы методов и игнорировать возвращаемое значение, как показано в следующем примере.
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 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.
Вы можете выполнить ряд вызовов методов в одной инструкции. Это может быть удобно, если вы хотите написать одну инструкцию, которая объединяет последовательные операции. В следующем примере три вызова методов из предыдущего примера объединяются в одну строку кода.
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.
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 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[] свойство . Он добавляет десять случайных чисел к объекту StringBuilder , а затем выполняет итерацию каждого символа. Если категория Символа в Юникоде имеет значение UnicodeCategory.DecimalDigitNumber, оно уменьшает число на 1 (или изменяет число на 9, если его значение равно 0). В примере отображается содержимое 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
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 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 объекта использование 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 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 <
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 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 значение. Метод Remove удаляет указанное количество символов, начиная с определенной позиции индекса. Кроме того, можно удалить символы из конца StringBuilder объекта, задав его Length свойству значение, которое меньше длины текущего экземпляра.
В следующем примере удаляется часть текста из StringBuilder объекта , отображаются его результирующие значения емкости, максимальной емкости и свойства length, а затем вызывается 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
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 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?
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 с помощью строкового или регулярного выражения. Существует четыре способа реализации таких поисковых запросов, как показано в следующей таблице.
Метод | Плюсы | Минусы |
---|---|---|
Выполните поиск строковых значений перед их добавлением в StringBuilder объект . | Полезно для определения существования подстроки. | Не может использоваться, если позиция индекса подстроки важна. |
Вызовите ToString и выполните поиск возвращенного String объекта. | Легко использовать, если вы назначаете весь текст объекту StringBuilder , а затем начинаете изменять его. | Сложно повторять вызов ToString , если необходимо внести изменения, прежде чем весь текст будет добавлен в StringBuilder объект . При внесении изменений не забудьте работать с конца StringBuilder текста объекта. |
Chars[] Используйте свойство для последовательного поиска в диапазоне символов. | Полезно, если вам нужны отдельные символы или небольшая подстрока. | Если количество символов для поиска большое или логика поиска сложна. Приводит к очень низкой производительности для объектов, которые стали очень большими благодаря повторяющимся вызовам методов. |
Преобразуйте StringBuilder объект в String объект и выполните изменения в объекте String . | Полезно, если количество изменений невелико. | Сводит на нет преимущество StringBuilder производительности класса, если количество изменений большое. |
Давайте рассмотрим эти методы более подробно.
Если цель поиска — определить, существует ли определенная подстрока (т. е. если вас не интересует положение подстроки), можно выполнить поиск строк перед их сохранением в объекте StringBuilder . В следующем примере представлена одна возможная реализация. Он определяет класс,
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
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 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 Вызовите метод , чтобы преобразовать объект в StringBuilderString объект . Вы можете выполнить поиск в строке с помощью таких методов, как String.LastIndexOf или String.StartsWith, или использовать регулярные Regex выражения и класс для поиска шаблонов. StringBuilder Поскольку оба объекта и String используют кодировку UTF-16 для хранения символов, позиции индексов символов, подстрок и совпадений с регулярными выражениями в обоих объектах одинаковы. Это позволяет использовать StringBuilder методы для внесения изменений в той же позиции, в которой этот текст находится в объекте String .
Примечание
Если вы используете этот подход, необходимо работать от конца StringBuilder объекта до его начала, чтобы не нужно было многократно преобразовывать объект в StringBuilder строку.
Этот подход показан в приведенном ниже примере. Он хранит четыре вхождения каждой буквы английского алфавита в объекте StringBuilder . Затем текст преобразуется String в объект и использует регулярное выражение для определения начальной позиции каждой последовательности из четырех символов. Наконец, он добавляет подчеркивание перед каждой последовательностью из четырех символов, за исключением первой последовательности, и преобразует первый символ последовательности в верхний регистр.
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
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 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
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 Example Public Sub Main() ' Create a StringBuilder object with 4 successive occurrences ' of each character in the English alphabet. Dim sb As New StringBuilder() For ctr As UShort = AscW("a") To Ascw("z") sb.Append(ChrW(ctr), 4) Next ' Iterate the text to determine when a new character sequence occurs. Dim position As Integer = 0 Dim current As Char = ChrW(0) Do If sb(position) <> current Then current = sb(position) sb(position) = Char.ToUpper(sb(position)) If position > 0 Then sb.Insert(position, "_") position += 2 Else position += 1 End If Loop While position <= sb.Length - 1 ' Display the resulting string. Dim sbString As String = sb.ToString() Dim line As Integer = 0 Do Dim nChars As Integer = If(line * 80 + 79 <= sbString.Length, 80, sbString.Length - line * 80) Console.WriteLine(sbString.Substring(line * 80, nChars)) line += 1 Loop While line * 80 < sbString.Length End Sub End Module ' The example displays the following output: ' Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ ' Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
Сохраните весь неизмененные текст в объекте StringBuilder , вызовите StringBuilder.ToString метод для преобразования StringBuilder объекта String в объект и выполните изменения в объекте String . Этот подход можно использовать при наличии всего нескольких изменений. В противном случае затраты на работу с неизменяемыми строками могут свести на нет преимущества производительности при использовании StringBuilder объекта .
Следующий пример по функциональности идентичен предыдущим двум примерам, но отличается по реализации. Он создает 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
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 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) |
Добавляет строковое представление указанного логического значения к данному экземпляру. |
Append(Byte) |
Добавляет строковое представление указанного 8-разрядного целого числа без знака к данному экземпляру. |
Append(Char) |
Добавляет строковое представление указанного объекта Char в данный экземпляр. |
Append(Char*, Int32) |
Добавляет к данному экземпляру массив символов Юникода начиная с указанного адреса. |
Append(Char, Int32) |
Добавляет указанное число копий строкового представления символа Юникода к данному экземпляру. |
Append(Char[]) |
Добавляет строковое представление символа Юникода в указанном массиве к данному экземпляру. |
Append(Char[], Int32, 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(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, CompositeFormat, Object[]) |
Предоставляет изменяемую строку символов. Этот класс не наследуется. |
AppendFormat(IFormatProvider, CompositeFormat, ReadOnlySpan<Object>) |
Предоставляет изменяемую строку символов. Этот класс не наследуется. |
AppendFormat(IFormatProvider, String, Object) |
Добавляет к данному экземпляру строку, возвращаемую в результате обработки строки составного формата, содержащей ноль или более элементов формата. Каждый элемент формата заменяется строковым представлением одного аргумента с использованием указанного поставщика формата. |
AppendFormat(IFormatProvider, String, Object, Object) |
Добавляет к данному экземпляру строку, возвращаемую в результате обработки строки составного формата, содержащей ноль или более элементов формата. Каждый элемент формата заменяется строковым представлением любого из двух аргументов с помощью указанного поставщика формата. |
AppendFormat(IFormatProvider, String, Object, Object, Object) |
Добавляет к данному экземпляру строку, возвращаемую в результате обработки строки составного формата, содержащей ноль или более элементов формата. Каждый элемент формата заменяется строковым представлением любого из трех аргументов с помощью указанного поставщика формата. |
AppendFormat(IFormatProvider, String, Object[]) |
Добавляет к данному экземпляру строку, возвращаемую в результате обработки строки составного формата, содержащей ноль или более элементов формата. Каждый элемент формата заменяется строковым представлением соответствующего аргумента в массиве параметров с помощью указанного поставщика формата. |
AppendFormat(String, Object) |
Добавляет к данному экземпляру строку, возвращаемую в результате обработки строки составного формата, содержащей ноль или более элементов формата. Каждый элемент формата заменяется строковым представлением одного аргумента. |
AppendFormat(String, Object, Object) |
Добавляет к данному экземпляру строку, возвращаемую в результате обработки строки составного формата, содержащей ноль или более элементов формата. Каждый элемент формата заменяется строковым представлением любого из двух аргументов. |
AppendFormat(String, Object, Object, Object) |
Добавляет к данному экземпляру строку, возвращаемую в результате обработки строки составного формата, содержащей ноль или более элементов формата. Каждый элемент формата заменяется строковым представлением любого из трех аргументов. |
AppendFormat(String, 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, 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() |
Возвращает объект, который можно использовать для прохода по фрагментам символов, представленных в |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
Insert(Int32, Boolean) |
Вставляет строковое представление логического значения в данный экземпляр на указанную позицию символа. |
Insert(Int32, Byte) |
Вставляет строковое представление указанного 8-разрядного целого числа без знака в данный экземпляр на указанную позицию символа. |
Insert(Int32, Char) |
Вставляет строковое представление указанного символа Юникода в данный экземпляр на указанную позицию символа. |
Insert(Int32, Char[]) |
Вставляет строковое представление указанного массива символов Юникода в данный экземпляр на указанную позицию символа. |
Insert(Int32, Char[], Int32, Int32) |
Вставляет строковое представление указанного подмассива символов Юникода в данный экземпляр на указанную позицию символа. |
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, SByte) |
Вставляет строковое представление указанного 8-разрядного знакового целого числа в данный экземпляр на указанную позицию символа. |
Insert(Int32, Single) |
Вставляет строковое представление числа одинарной точности с плавающей запятой с обычной точностью в данный экземпляр на указанную позицию символа. |
Insert(Int32, String) |
Вставляет строку в данный экземпляр на указанную позицию символа. |
Insert(Int32, String, Int32) |
Вставляет одну или более копий указанной строки в данный экземпляр на указанную позицию символа. |
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. |