Символы и строки
Изменяемые строки
Чтобы создать строку, которую можно изменять, в С# предусмотрен класс 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);
Основные элементы класса приведены в таблице:
Как видим, методы класса 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(); }
С изменяемой строкой можно работать не только как с объектом, но как с массивом символов:
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]); }