Строки StringBuilder

Кроме обычных строк (тип string) в языке C# существует ещё один вид строк — StringBuilder. Для символов, хранящихся в строках StringBuilder, также используется Unicode. Принципиальное отличие строки StringBuilder от строки string заключается в том, что элементы строки StringBuilder можно изменять напрямую, при этом такая строка заново не создаётся.

Для работы со строками StringBuilder необходимо подключить дополнительное пространство имён:

using System.Text;

Создание объекта StringBuilder

Прежде чем начать работать со строкой типа 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

При работе со строкой типа 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

Свойства и методы класса StringBuilder

Этот класс имеет достаточно большое количество свойств и методов, аналогичных свойствам и методам для строк string, хотя, надо признать, что для класса StringBuilder их меньше, чем для типа string.

Среди свойств необходимо отметить два наиболее важных:

Теперь рассмотрим наиболее употребительные методы класса 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 . . .



Назад
На верх
Вперёд
Hosted by uCoz