Довольно большое количество задач, которые могут встретиться при разработке приложений, так или иначе связано с обработкой строк - парсинг веб-страниц, поиск в тексте, какие-то аналитические задачи, связанные с извлечением нужной информации из текста и т.д. Поэтому в этом плане работе со строками уделяется особое внимание.
В языке 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
Многострочные строки
Начиная с C# 11 с помощью трех пар двойных кавычек можно оформить многострочный текст, в том числе с применением интерполяции:
Print();
PrintValue("hello");
void Print()
{
string text = """
<element attr="content">
<body>
</body>
</element>
""";
Console.WriteLine(text);
}
void PrintValue(string val)
{
string text = $"""
<element attr="content">
<body>
{val}
</body>
</element>
""";
//// или так
//string text = $$"""
// <element attr="content">
// <body>
// {{val}}
// </body>
// </element>
// """;
Console.WriteLine(text);
}
Основные методы строк
Основная функциональность класса String раскрывается через его методы, среди которых можно выделить следующие:
Compare: сравнивает две строки с учетом текущей культуры (локали) пользователя
CompareOrdinal: сравнивает две строки без учета локали
Contains: определяет, содержится ли подстрока в строке
Concat: соединяет строки
CopyTo: копирует часть строки, начиная с определенного индекса в массив
EndsWith: определяет, совпадает ли конец строки с подстрокой
Format: форматирует строку
IndexOf: находит индекс первого вхождения символа или подстроки в строке
Insert: вставляет в строку подстроку
Join: соединяет элементы массива строк
LastIndexOf: находит индекс последнего вхождения символа или подстроки в строке
Replace: замещает в строке символ или подстроку другим символом или подстрокой
Split: разделяет одну строку на массив строк
Substring: извлекает из строки подстроку, начиная с указанной позиции
ToLower: переводит все символы строки в нижний регистр
ToUpper: переводит все символы строки в верхний регистр
Trim: удаляет начальные и конечные пробелы из строки
В следующих статьях разберем работу этих методов.