$ sudo teach IT
Модуль 2 · Примитивные операции

Урок 2.3 — Работа со строками

Строки — это не просто текст. Это целая вселенная методов для обработки, поиска и преобразования.

Текст окружает нас везде. Имя пользователя, адрес почты, сообщение в чате, JSON-ответ от сервера — всё это строки. C# предоставляет огромный набор инструментов для работы со строками. В этом уроке мы разберём 90% того, что тебе когда-либо понадобится.

🔗

Конкатенация строк: + и string.Concat()

Конкатенация — это склеивание строк. Базовый способ — через оператор +.

C# · Конкатенация строк
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. Но давай закрепим:

C# · Интерполяция с выражениями
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, а пока — краткий пример:

C# · StringBuilder (обзор)
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Возврат кареткиРеже используется отдельно
\0Null-символРедко, для C-строк
🧵

Вербатим-строки: @"..."

Вербатим-строки (буквальные строки) — это строки, перед которыми стоит @. В них не работают escape-последовательности. Всё пишется как есть. Это очень удобно для путей и regex:

C# · Вербатим-строки
// Без @ — приходится экранировать обратные слэши:
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}");
    }
}
📌

Что важно запомнить

1️⃣
Конкатенация через + работает, но в циклах используй StringBuilder.
2️⃣
Интерполяция $"..." — лучший способ вставить переменные в текст.
3️⃣
Методы строк: ToLower(), ToUpper(), Substring(), Replace(), Split(), Join(), Trim(), IndexOf(), Contains(), StartsWith(), EndsWith()
4️⃣
Escape-последовательности: \n (новая строка), \t (табуляция), \" (кавычка), \\ (обратный слеш)
5️⃣
Вербатим-строки @"..." отключают экранирование. Удобно для путей и многострочного текста.
6️⃣
IsNullOrEmpty и IsNullOrWhiteSpace — проверяй строки перед использованием.

Тест: 2.3: Работа со строками

7 вопросов

Работа со строками

Premium