Строки и класс System.String


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

В языке C# строковые значения представляет тип string, а вся функциональность работы с данным типом сосредоточена в классе System.String. Собственно string является псевдонимом для класса String. Объекты этого класса представляют текст как последовательность символов Unicode. Максимальный размер объекта String может составлять в памяти 2 ГБ, или около 1 миллиарда символов.

Создание строк
Создавать строки можно, как используя переменную типа string и присваивая ей значение, так и применяя один из конструкторов класса String:

string s1 = "hello";
string s2 = new String('a', 6); // результатом будет строка "aaaaaa"
string s3 = new String(new char[] { 'w', 'o', 'r', 'l', 'd' });
string s4 = new String(new char[] { 'w', 'o', 'r', 'l', 'd' }, 1, 3); // orl

Console.WriteLine(s1); // hello
Console.WriteLine(s2); // aaaaaaa
Console.WriteLine(s3); // world
Console.WriteLine(s4); // orl
Конструктор String имеет различное число версий. Так, вызов конструктора

new String('a', 6)
6 раз повторит объект из первого параметра, то есть фактически создаст строку "aaaaaa".

Еще один конструктор принимает массив символов, из которых создается строка

string s3 = new String(new char[] { 'w', 'o', 'r', 'l', 'd' });
Третий использованный выше в примере конструктор позволяет создать строку из части массива символов. Второй параметр передает начальный индекс, с которого извлкаются символы, а третий параметр указывает на количество символов:

string s4 = new String(new char[] { 'w', 'o', 'r', 'l', 'd' }, 1, 3); // orl
Строка как набор символов
Так как строка хранит коллекцию символов, в ней определен индексатор для доступа к этим символам:

public char this[int index] {get;}
Применяя индексатор, мы можем обратиться к строке как к массиву символов и получить по индексу любой из ее символов:

string message = "hello";
// получаем символ
char firstChar = message[1]; // символ 'e'
Console.WriteLine(firstChar); //e

Console.WriteLine(message.Length); // длина строки
Используя свойство Length, как и в обычном массиве, можно получить длину строки.

Перебор строк
Класс String реализует интерфейс IEnumerable, благодаря чему строку можно перебрать в цикле foreach как набор объектов char. Также можно с помощью других типов циклов перебрать строку, применяя обращение к символам по индексу:

string message = "hello";

for(var i =0; i < message.Length; i++)
{
Console.WriteLine(message[i]);
}
foreach(var ch in message)
{
Console.WriteLine(ch);
}
Сравнение строк
В отличие от других классов строки сравниваются по значению их символов, а не по ссылкам:

string message1 = "hello";
string message2 = "hello";

Console.WriteLine(message1 == message2); // true
Основные методы строк
Основная функциональность класса String раскрывается через его методы, среди которых можно выделить следующие:

Compare: сравнивает две строки с учетом текущей культуры (локали) пользователя

CompareOrdinal: сравнивает две строки без учета локали

Contains: определяет, содержится ли подстрока в строке

Concat: соединяет строки

CopyTo: копирует часть строки, начиная с определенного индекса в массив

EndsWith: определяет, совпадает ли конец строки с подстрокой

Format: форматирует строку

IndexOf: находит индекс первого вхождения символа или подстроки в строке

Insert: вставляет в строку подстроку

Join: соединяет элементы массива строк

LastIndexOf: находит индекс последнего вхождения символа или подстроки в строке

Replace: замещает в строке символ или подстроку другим символом или подстрокой

Split: разделяет одну строку на массив строк

Substring: извлекает из строки подстроку, начиная с указанной позиции

ToLower: переводит все символы строки в нижний регистр

ToUpper: переводит все символы строки в верхний регистр

Trim: удаляет начальные и конечные пробелы из строки

Разберем работу этих методов.