Опубликован: 19.02.2009 | Уровень: специалист | Доступ: платный
Лекция 9:

Символы и строки

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >

Изменяемые строки

Чтобы создать строку, которую можно изменять, в С# предусмотрен класс StringBuilder, определенный в пространстве имен System.Text. Объекты этого класса всегда объявляются с явным вызовом конструктора класса (через операцию new ) . Примеры создания изменяемых строк:

StringBuilder a =new StringBuilder();	//создание пустой строки, размер по умолчанию 16 символов
//инициализация строки и выделение необходимой памяти
StringBuilder b = new StringBuilder("abcd"); 
//создание пустой строки и выделение памяти под 100 символов
StringBuilder с = new StringBuilder(100);
//инициализация строки и выделение памяти под 100 символов 
StringBuilder d = new StringBuilder("abcd", 100);
//инициализация подстрокой "bcd", и выделение памяти под 100 символов	
StringBuilder d = new StringBuilder("abcd", 1, 3,100);

Основные элементы класса приведены в таблице:

Название Вид Описание
Append Экземплярный метод Добавление данных в конец строки. Разные варианты метода позволяют добавлять в строку величины любых встроенных типов, массивы символов, строки и подстроки string.
AppendFormat Экземплярный метод Добавление форматированной строки в конец строки
Capacity свойство Получение и установка емкости буфера. Если устанавливаемое значение меньше текущей длины строки или больше максимального, то генерируется исключение ArgumentOutOfRangeException
Insert Экземплярный метод Вставка подстроки в заданную позицию
Length изменяемое свойство Возвращает длину строки. Присвоение ему значения 0 сбрасывает содержимое и очищает строку
MaxCapacity неизменное свойство Возвращает наибольшее количество символов, которое может быть размещено в строке
Remove Экземплярный метод Удаление подстроки из заданной позиции
Replace Экземплярный метод Замена всех вхождений заданной подстроки или символа новой подстрокой или символом
ToString Экземплярный метод Преобразование в строку типа string
Chars изменяемое свойство Возвращает из массива или устанавливает в массиве символ с заданным индексом. Вместо него можно пользоваться квадратными скобками []
Equals Экземплярный метод Возвращает true, только если объекты имеют одну и ту же длину и состоят из одних и тех же символов
CopyTo Экземплярный метод Копирует подмножество символов строки в массив char

Как видим, методы класса StringBuilder менее развиты, чем методы класса String, но они позволяют более эффективно использовать память за счет работы с изменяемыми строками. Рассмотрим примеры использования данных методов.

static void Main()
{
 try
 { 
  StringBuilder str=new StringBuilder("Площадь");
  PrintString(str);
  str.Append(" треугольника равна");	
  PrintString(str);
  str.AppendFormat(" {0:f2} см ", 123.456);	
  PrintString(str);
  str.Insert(8, "данного ");
  PrintString(str);
  str.Remove(7, 21);
  PrintString(str);
  str.Replace("а", "о");
  PrintString(str);
  StringBuilder str1=new StringBuilder(Console.ReadLine());
  StringBuilder str2=new StringBuilder(Console.ReadLine());
  Console.WriteLine(str1.Equals(str2));
 }
 catch 
 {
 	Console.WriteLine("Вознико исключение");
 }
}

static void PrintString(StringBuilder a)
{
 Console.WriteLine("Строка: "+a);
 Console.WriteLine("Текущая длина строки " +a.Length);
 Console.WriteLine("Объем буфера "+a.Capacity);
 Console.WriteLine("Максимальный объем буфера "+a.MaxCapacity);
 Console.WriteLine();
}
Задание. Самостоятельно изучите метод CopyTo.

С изменяемой строкой можно работать не только как с объектом, но как с массивом символов:

static void Main()
{
 StringBuilder a = new StringBuilder("2*3=3*2");
 Console.WriteLine(a);
 int k=0;
 for (int i = 0; i < a.Length; ++i )
 if (char.IsDigit(a[i])) k+=int.Parse(a[i].ToString());
 Console.WriteLine(k);
}

На практике часто комбинируют работу с изменяемыми и неизменяемыми строками. Однако если необходимо изменять строку, то в этом случае используют StringBuilder.

Пример. Дана строка, в которой содержится осмысленное текстовое сообщение. Слова сообщения разделяются пробелами и знаками препинания. Вывести все слова сообщения, которые начинаются и заканчиваются на одну и ту же букву.

static void Main()
{
 Console.WriteLine("Введите строку: ");
 StringBuilder a = new StringBuilder(Console.ReadLine());
 Console.WriteLine("Исходная строка: "+a);
 for (int i=0; i<a.Length;)
 if (char.IsPunctuation(a[i])) a.Remove(i,1);
 else ++i;
 string str=a.ToString();
 string []s=str.Split(' ');
 Console.WriteLine("Искомые слова: ");
 for (int i=0; i<s.Length; ++i)
 if (s[i][0]==s[i][s.Length-1]) Console.WriteLine(s[i]);
}
Задание. Измените программу так, чтобы она корректно работала и для случая, когда в исходной строке встречаются лишние пробелы.
< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Sahib Dadashev
Sahib Dadashev
Россия
Роман Казимирчик
Роман Казимирчик
Беларусь