Опубликован: 25.09.2008 | Доступ: свободный | Студентов: 3223 / 516 | Оценка: 4.32 / 3.98 | Длительность: 18:50:00
ISBN: 978-5-94774-991-5
Лекция 3:

Основы языка C#

Работа со строками в C#

По аналогии с массивами все строки в C# происходят от одного базового класса - System.String, в котором реализовано достаточно много различных методов, осуществляющих всевозможные операции над строками. Наиболее интересные методы класса String представлены ниже.

Length Позволяет получить количество символов в строке.
Concat() Позволяет соединить несколько строк или переменных типа object.
CompareTo() Позволяет сравнить две строки. В случае равенства строк результат выполнения функции равен нулю. При положительном значении функции большей является строка, для которой вызывался метод.
Copy() Создает новую копию существующей строки.
Format() Применяется для форматирования строки с использованием различных примитивов (строк и числовых данных) и подстановочных выражений вида {0}.
Insert() Позволяет вставить одну строку внутрь существующей.
Remove() Replace() Удаляют или заменяют символы в строке.
ToUpper() ToLower() Преобразуют все символы строки в строчные или прописные.
Chars Позволяет получить символ, находящийся в определенной позиции строки.
Join() Создает строку, соединяя заданные строки и разделяя их строкой-разделителем.
Replace() Заменяет один символ строки другим.
Split() Возвращает массив строк с элементами - подстроками основной строки, между которыми находятся символы-разделители.
Substring() Позволяет получить подстроку основной строки, начинающуюся с определенного символа и имеющую заданную длину.
Trim() Удаляет пробелы либо набор заданных символов в начале и конце основной строки.
ToCharArray() Создает массив символов и помещает в него символы исходной строки.

При работе со строками в C# необходимо учитывать следующее. Тип string является ссылочным типом. Однако, несмотря на это, при использовании операций сравнения происходит сравнение значений строковых объектов, а не адресов этих объектов, размещенных в оперативной памяти. Кроме того, оператор "+" объекта string перегружен так, что при его использовании используется метод Concat().

Рассмотрим несколько примеров использования возможностей работы со строками.

В следующем примере функция MakeLine создает строку, которая состоит из символов, получающихся путем несложных вычислений. Результаты вычислений заносятся в массив строк. Таким образом, массив sArr после завершения цикла содержит значения всех полученных чисел. После этого, используя разделитель, передаваемый в функцию в качестве аргумента, а также функцию Join, значения всех ячеек массива sArr объединяются в строку:

protected void Page_Load(object sender, EventArgs e)
{
  Response.Write(MakeLine(0, 5, ", "));
  Response.Write("</br>");
  Response.Write(MakeLine(1, 6, " "));
  Response.Write("</br>");
  Response.Write(MakeLine(9, 9, ": "));
  Response.Write("</br>");
  Response.Write(MakeLine(4, 7, "< "));
}

private static string MakeLine(int initVal, int multVal, string sep)
{
  string[] sArr = new string[10];

  for (int i = initVal; i < initVal+10; i++)
   sArr[i-initVal] = String.Format("{0,-3}", i * multVal);

   return String.Join(sep, sArr);
}

Результат работы программы представлен на рис. 3.5.

Результат работы программы с использованием функции Join

Рис. 3.5. Результат работы программы с использованием функции Join

Довольно часто при работе со строками возникает необходимость разделить строку на подстроки, отделенные друг от друга заданными символами-разделителями. В следующем примере задается строка символов, в которой присутствует несколько символов-разделителей. При помощи функции Split данная строка разделяется на подстроки, которые затем выводятся на экран каждая в отдельной строке. Для задания символов-разделителей используется массив символов. В этом примере также применяется функция Trim, необходимая в данном случае для того, чтобы убедиться в том, что заданная строка не состоит из одних лишь пробелов.

Исходный код данного примера приведен ниже.

string words = "строка, содержащая несколько слов, а также
 знаков пунктуации: таких как двоеточие и точка.";
string [] split = words.Split(new Char [] {' ', ',', '.', ':'});
foreach (string s in split)
{
  if (s.Trim() != "")
    Response.Write(s+"</br>");
}

Итогом работы данной программы будет следующий результат, изображенный на рис. 3.6.

Результат работы программы с использованием функции Split

Рис. 3.6. Результат работы программы с использованием функции Split

Управляющие последовательности и специальные символы в строках

При выводе на экран строк в C# можно использовать управляющие последовательности, позволяющие управлять процессом вывода текстовой информации на экран. Основной сферой применения этих последовательностей является вывод тех символов, которые невозможно вывести на экран при помощи обычной стандартной строки, заключенной в кавычки.

Список основных управляющих последовательностей приведен ниже.

\' Одинарная кавычка
\" Двойная кавычка
\\ Обратный слэш
\a Системное оповещение
\b Backspace
\f Начало следующей страницы
\n Начало новой строки
\r Return
\t Горизонтальный символ табуляции

Не все из этих символов допустимо использовать в строках Web-приложения. Тем не менее на рис. 3.7 отображен результат выполнения следующей команды:

string esc = "Имя программы \"Visual Studio 2005\",
 местонахождение: C:\\Program Files\\Microsoft Visual
 Studio 8\\";
Label1.Text = esc;
Пример отображения строки с использованием управляющих символов

увеличить изображение
Рис. 3.7. Пример отображения строки с использованием управляющих символов

Кроме управляющих последовательностей в C# предусмотрен специальный префикс @, предназначенный для дословного вывода строки вне зависимости от наличия в ней управляющих символов. Можно сказать, что этот префикс отключает присутствующие в строке управляющие символы.

Использование класса System.Text.StringBuilder

При работе со строками в C# необходимо учитывать то, что строки являются неизменяемыми. Все действия, направленные на изменение строк, на самом деле не изменяют исходный ее вариант. Они лишь возвращают измененную копию строки. Это можно увидеть на следующем примере.

string s1 = "Пример строки";
string s2 = s1.ToUpper();

Response.Write(s1);
Response.Write("</br>");
Response.Write(s2);

В данном случае строка s1 не претерпела никаких изменений. Метод ToUpper() создал копию строки s1 и применил к ней необходимые преобразования, поэтому на экран будет выведена как исходная строка, так и строка, подвергшаяся изменению. Такое же утверждение справедливо и для обычной операции конкатенации строк. Результатом выполнения операции конкатенации строк является также новая строка.

В ряде случаев следует избегать ситуаций, когда в результате выполнения операции создается новая строка, т. к. это неизбежно связано с дополнительными накладными расходами памяти и других ресурсов компьютера при выполнении операции. C# содержит специальный класс StringBuilder, используя который можно избежать создания копий строк при их обработке. Все изменения, вносимые в объект данного класса, немедленно отображаются в нем, что в целом ряде случаев гораздо эффективнее, чем работа с множеством копий строки.

Основной операцией, чаще всего используемой классом StringBuilder, является операция добавления к строке содержимого. Для этого существует метод Append. Следующий код добавляет одну строку к другой и выводит результат в окно браузера. При этом изменяется оригинал строки, копия не создается:

StringBuilder sb = new StringBuilder("Ехали медведи на
 велосипеде");
sb.Append(", а за ними кот задом наперед");
Response.Write(sb);

Кроме добавления класс StringBuilder содержит множество других методов, наиболее значимые из которых перечислены ниже. После того как все необходимые действия, связанные с обработкой строки, были выполнены, необходимо вызвать метод ToString() для перевода содержимого объекта в обычный тип данных string.

Append Добавление заданной строки в конец строки объекта.
AppendFormat Добавление заданной форматированной строки (строки, содержащей управляющие символы) в конец строки объекта.
CopyTo Копирование символов заданного сегмента строки в заданные ячейки массива символов.
Insert Добавление строки в заданную позицию строки объекта.
Remove Удаление заданного количества символов из строки объекта
Replace Замена заданного символа либо строки объекта на другой заданный символ либо строку.

При интенсивной работе со строками рекомендуется использовать класс StringBuilder, т. к. это позволяет уменьшить накладные расходы, связанные с созданием копии строки при выполнении каждой операции.