Урок 2.3 — Работа со строками
Строки — это не просто текст. Это целая вселенная методов для обработки, поиска и преобразования.
Текст окружает нас везде. Имя пользователя, адрес почты, сообщение в чате, JSON-ответ от сервера — всё это строки. C# предоставляет огромный набор инструментов для работы со строками. В этом уроке мы разберём 90% того, что тебе когда-либо понадобится.
Конкатенация строк: + и string.Concat()
Конкатенация — это склеивание строк. Базовый способ — через оператор +.
string firstName = "Иван";
string lastName = "Петров";
// Через + (просто и наглядно)
string fullName = firstName + " " + lastName;
Console.WriteLine(fullName); // Иван Петров
// Через string.Concat()
string same = string.Concat(firstName, " ", lastName);
// Если нужно соединить много строк:
string[] words = { "C#", "это", "круто" };
string sentence = string.Concat(words);
Console.WriteLine(sentence); // C#этокруто
// С пробелами:
sentence = string.Join(" ", words);
Console.WriteLine(sentence); // C# это круто
+ удобна для 2-3 строк. Но если нужно склеить много строк в цикле — используй StringBuilder (мы разберём его в уроке 10.3). Каждая конкатенация через + создаёт новую строку в памяти, что медленно при больших объёмах.Интерполяция: $"..."
Самый удобный способ — интерполяция. Мы уже касались её в уроке 2.1. Но давай закрепим:
string product = "Кофе";
int quantity = 3;
double price = 250.0;
// Базовая интерполяция:
Console.WriteLine($"Товар: {product}, {quantity} шт. по {price} руб.");
// Выражения внутри {}:
Console.WriteLine($"Сумма: {quantity * price} руб.");
Console.WriteLine($"Со скидкой 10%: {quantity * price * 0.9} руб.");
// Форматирование чисел:
double pi = Math.PI;
Console.WriteLine($"π = {pi:F2}"); // π = 3.14 (2 знака после запятой)
Console.WriteLine($"π = {pi:F4}"); // π = 3.1416 (4 знака)
{pi:F2} — форматирование с фиксированной точностью. F2 означает «2 знака после запятой». Можно использовать N2 (с разделителями разрядов), C (денежный формат) и другие.StringBuilder для эффективной работы
Строки в C# неизменяемы (immutable). Когда ты делаешь str = str + "!", C# не дописывает символ к существующей строке — он создаёт новую строку, копирует туда старое содержимое и добавляет «!». Если делать это в цикле 1000 раз — будет создано 1000 строк в памяти. Это медленно.
StringBuilder решает эту проблему. Он работает как «черновик»: ты изменяешь его содержимое, не создавая новые объекты. Мы подробно разберём его в модуле 10, а пока — краткий пример:
using System.Text;
StringBuilder sb = new StringBuilder();
sb.Append("Привет, ");
sb.Append("мир");
sb.Append("!");
string result = sb.ToString();
Console.WriteLine(result); // Привет, мир!
Все методы работы со строками
🔠 Изменение регистра
string text = "Привет, Мир!";
Console.WriteLine(text.ToLower()); // привет, мир!
Console.WriteLine(text.ToUpper()); // ПРИВЕТ, МИР!
✂️ Вырезание части строки (Substring)
string word = "Программирование";
Console.WriteLine(word.Substring(0, 10)); // Программир (с 0, 10 символов)
Console.WriteLine(word.Substring(6)); // мирование (с 6 до конца)
Console.WriteLine(word[..6]); // Програм (range, C# 8+)
Console.WriteLine(word[^3..]); // ие (последние 3 символа)
🔄 Замена (Replace)
string sentence = "Я люблю Java";
Console.WriteLine(sentence.Replace("Java", "C#")); // Я люблю C#
✂️ Разделение (Split) и соединение (Join)
string data = "яблоко,груша,банан,виноград";
string[] fruits = data.Split(',');
Console.WriteLine(fruits[0]); // яблоко
Console.WriteLine(fruits[2]); // банан
// Обратно — соединяем массив в строку:
string joined = string.Join(" | ", fruits);
Console.WriteLine(joined); // яблоко | груша | банан | виноград
✂️ Удаление пробелов (Trim)
string dirty = " много пробелов ";
Console.WriteLine($"'{dirty.Trim()}'"); // 'много пробелов' (с обоих сторон)
Console.WriteLine($"'{dirty.TrimStart()}'"); // 'много пробелов '
Console.WriteLine($"'{dirty.TrimEnd()}'"); // ' много пробелов'
🔍 Поиск (IndexOf, Contains, StartsWith, EndsWith)
string email = "user@example.com";
Console.WriteLine(email.Contains("@")); // True
Console.WriteLine(email.StartsWith("user")); // True
Console.WriteLine(email.EndsWith(".com")); // True
int atIndex = email.IndexOf('@');
Console.WriteLine(atIndex); // 4 (позиция символа @)
Console.WriteLine(email[..atIndex]); // user (всё до @)
🧪 Проверка на пустоту (IsNullOrEmpty, IsNullOrWhiteSpace)
string empty = "";
string whitespace = " ";
string notEmpty = "C#";
Console.WriteLine(string.IsNullOrEmpty(empty)); // True
Console.WriteLine(string.IsNullOrEmpty(whitespace)); // False (пробелы — не пусто)
Console.WriteLine(string.IsNullOrWhiteSpace(whitespace));// True (только пробелы)
Console.WriteLine(string.IsNullOrEmpty(notEmpty)); // False
Управляющие последовательности
Не все символы можно просто написать на клавиатуре. Например, как вставить в строку символ табуляции или кавычку? Для этого в C# есть escape-последовательности — комбинации, начинающиеся с обратной косой черты \:
| Код | Значение | Пример |
|---|---|---|
\n | Новая строка | "строка1\nстрока2" |
\t | Табуляция | "Имя:\tИван" |
\" | Двойная кавычка | "Он сказал: \"Привет\"" |
\\ | Обратная косая черта | "C:\\Program Files\\" |
\r | Возврат каретки | Реже используется отдельно |
\0 | Null-символ | Редко, для C-строк |
Вербатим-строки: @"..."
Вербатим-строки (буквальные строки) — это строки, перед которыми стоит @. В них не работают escape-последовательности. Всё пишется как есть. Это очень удобно для путей и regex:
// Без @ — приходится экранировать обратные слэши:
string path1 = "C:\\Users\\Иван\\Documents";
// С @ — пишем как есть:
string path2 = @"C:\Users\Иван\Documents";
// Многострочный текст с @:
string text = @"Первая строка
Вторая строка
Третья строка";
// Кавычка внутри @"..." удваивается:
string quote = @"Он сказал: ""Привет""";
Console.WriteLine(quote); // Он сказал: "Привет"
$ и @: $@"Путь: {path}" — интерполяция + вербатим.Сводный пример — обработка строк
using System;
class Program
{
static void Main()
{
// Данные от пользователя (например, из формы регистрации)
string fullName = " иван пЕтрОВ ";
string email = " IVAN@EXAMPLE.COM ";
// Чистим данные
fullName = fullName.Trim();
email = email.Trim().ToLower();
// Приводим имя к красивому виду
string[] nameParts = fullName.Split(' ');
string firstName = nameParts[0];
string lastName = nameParts.Length > 1 ? nameParts[1] : "";
// Первая буква заглавная, остальные строчные
firstName = char.ToUpper(firstName[0]) + firstName.Substring(1).ToLower();
if (lastName.Length > 0)
lastName = char.ToUpper(lastName[0]) + lastName.Substring(1).ToLower();
// Валидация email
bool hasAt = email.Contains("@");
bool hasDot = email.Contains(".");
// Вывод
Console.WriteLine($"Имя: {firstName} {lastName}");
Console.WriteLine($"Email: {email}");
Console.WriteLine($"Корректен: {hasAt && hasDot}");
}
}
Что важно запомнить
Тест: 2.3: Работа со строками
7 вопросов