Кроме обычных строк (тип string) в языке C# существует ещё один вид строк — StringBuilder. Для символов, хранящихся в строках StringBuilder, также используется Unicode. Принципиальное отличие строки StringBuilder от строки string заключается в том, что элементы строки StringBuilder можно изменять напрямую, при этом такая строка заново не создаётся.
Для работы со строками StringBuilder необходимо подключить дополнительное пространство имён:
using System.Text;
Прежде чем начать работать со строкой типа StringBuilder, необходимо создать объект типа StringBuilder. Для этого существует несколько вариантов:
1)Пустая строка:
StringBuilder sb = new StringBuilder();
2)Строке можно задать начальную длину — здесь строке sb будет выделена память под n элементов:
int n = 50;
StringBuilder sb = new StringBuilder(n);
Этот вариант есть смысл использовать в том случае, когда заранее известна необходимая длина строки. В остальных случаях проще использовать первый вариант.
3)Строка может получить начальное значение:
StringBuilder sb = new StringBuilder("qwerty");
Для ввода-вывода строки можно использовать методы ReadLine() и WriteLine() класса Console:
StringBuilder sb = new StringBuilder(Console.ReadLine());
Console.WriteLine(sb);
При работе со строкой типа StringBuilder можно непосредственно обращаться к отдельным элементам этой строки, можно их изменять, при этом память для строки заново не выделяется. Индексы в строке начинаются с 0, т.е. как в обычном массиве. Текущая длина строки хранится в свойстве Length.
Пример. Инвертировать строку, заданную с клавиатуры.
Вот фрагмент программы, которая реализует данную задачу:
StringBuilder sb = new StringBuilder(Console.ReadLine());
char c;
for(int i = 0, j = sb.Length - 1; i < j; i++, j--)
{
c = sb[i];
sb[i] = sb[j];
sb[j] = c;
}
Console.WriteLine(sb);
Введённая с клавиатуры строка:
qwerty
Инвертированная строка:
ytrewq
Этот класс имеет достаточно большое количество свойств и методов, аналогичных свойствам и методам для строк string, хотя, надо признать, что для класса StringBuilder их меньше, чем для типа string.
Среди свойств необходимо отметить два наиболее важных:
Length — текущее количество символов, хранящихся в строке;
Capacity — максимальное количество символов, которое может храниться в объекте , т.е. для текущего объекта выделена память именно под это количество символов.
Теперь рассмотрим наиболее употребительные методы класса StringBuilder. Обратите внимание на тот факт, что при вызове методов, например: Append(), Insert(), Remove(), Replace() для объекта типа StringBuilder полученный результат сохраняется в текущем объекте. Память для этого объекта будет выделяться заново только в том случае, если текущее количество символов (Length) превысит максимальное (Capacity).
1)Добавление строки к объекту — метод Append() используется для добавления некоего объекта в конец объекта StringBuilder. Рассмотрим хотя бы два примера:
а)добавление строки:
StringBuilder sb = new StringBuilder("qwerty");
sb.Append("++");
Console.WriteLine(sb);
На экране будет выведено:
qwerty++
б)добавление числа (оно автоматически преобразуется в строку):
StringBuilder sb = new StringBuilder("qwerty");
sb.Append(12.5);
Console.WriteLine(sb);
Результатом будет следующая строка:
qwerty12,5
2)Вставка — в заданную позицию (3) объекта sb вставим две копии строки "357":
StringBuilder sb = new StringBuilder("qwerty");
sb.Insert(3,"357",2);
Результат такой операции:
qwe357357rty
3)Удаление — из объекта sb, начиная с указанной позиции (1), удаляем требуемое количество символов (2):
StringBuilder sb = new StringBuilder("qwerty");
sb.Remove(1,2);
В результате получим:
qrty
4)Замена — все вхождения искомой строки ("we") заменяет на новое значение ("ABC"):
StringBuilder sb = new StringBuilder("qwerty_qwerty");
sb.Replace("we","ABC");
В результате замены имеем строку:
qABCrty_qABCrty
Также можно делать замену отдельных символов, например:
StringBuilder sb = new StringBuilder("qwerty_qwerty");
sb.Replace('w','A');
В этом случае результат будет таким:
qAerty_qAerty
5)Преобразование объекта типа StringBuilder в строку класса String:
string s = sb.ToString();
Пример 1. Дана символьная строка, содержащая хотя бы один символ '?' (вопросительный знак). Удалить все символы '!' (восклицательный знак) или '.' (точка), расположенные до первого символа '?' и заменить все пробелы, расположенные за первым символом '?', на символ подчёркивания '_'.
Возможная реализация:
using System;
using System.Text;
namespace Prim_StringBuilder
{
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Исходная строка:");
string s = Console.ReadLine();
int k = s.IndexOf('?');
Console.WriteLine("k={0}", k);
StringBuilder b1 = new StringBuilder(s.Substring(0, k));
Console.WriteLine(b1);
StringBuilder b2 = new StringBuilder(s.Substring(k));
Console.WriteLine(b2);
for(int i = 0; i < b1.Length; i++)
{
if(b1[i] == '!' || b1[i] == '.')
{
b1.Remove(i, 1);
i--;
}
}
b2.Replace(' ', '_');
s = b1.ToString() + b2.ToString();
Console.WriteLine("Результат:\n"+s);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результат работы:
Исходная строка:
1a!2.3!!.. 4.!.?6 7! ..?
k=15
1a!2.3!!.. 4.!.
?6 7! ..?
Результат:
1a23 4?6_7!_..?
Press any key to continue . . .
|
|
|
|