JavaRush /Курсы /C# SELF /Продвинутые методы класса string

Продвинутые методы класса string

C# SELF
9 уровень , 4 лекция
Открыта

1. Поиск подстроки в строке

В прошлой лекции вы научились получать подстроку из строки. А в этой мы научимся находить одну строку в другой. Для этого есть 5 шикарных методов:

Метод Contains: содержит ли строка подстроку?

Возвращает true, если переданная строка содержится в той, у которой вызвали метод.

string phrase = "Ветер перемен";
bool hasWord = phrase.Contains("перемен"); // true
Проверка наличия подстроки с помощью Contains

Поиск чувствителен к регистру! "ветер".Contains("В")false.

Метод IndexOf: найти позицию подстроки

Очень похоже на работу IndexOf в массивах: ищет подстроку в строке (от начала к концу) и возвращает индекс первого вхождения подстроки.

string text = "арбузарбуз";
int index = text.IndexOf("буз"); // 2
Поиск позиции подстроки с помощью IndexOf
  • Если ничего не найдено, возвращает -1.
  • Есть альтернатива с начальной позицией: IndexOf("буз", 4). Всё как в массивах.

Метод LastIndexOf: последнее вхождение

Также похоже на работу LastIndexOf в массивах: ищет подстроку в строке (от конца к началу) и возвращает индекс первого вхождения подстроки с конца.

string repeated = "задача задача";
int last = repeated.LastIndexOf("задача"); // 7
Поиск последнего вхождения подстроки с помощью LastIndexOf

Начинается/заканчивается строка с заданной подстроки

Также часто нужно проверить, что наша строка начинается (или заканчивается) определённой подстрокой. Для этого есть два метода:

  • StartsWith — проверяет, что строка начинается с определённой подстроки;
  • EndsWith — проверяет, что строка заканчивается на заданную подстроку.
string fileName = "photo.jpg";
bool isJpg = fileName.EndsWith(".jpg"); // true

string email = "support@company.com";
bool isSupport = email.StartsWith("support"); // true
Проверка начала и конца строки

Если хочется сравнить без учёта регистра, то нужно передать дополнительный параметр с указанием режима сравнения (см. документацию для StringComparison.OrdinalIgnoreCase).

2. Метод Replace: замена символов и подстрок

Метод Replace заменяет все вхождения строки А на строку Б. Появился как инструмент для борьбы с опечатками, цензурой и заменой переменных в шаблонах! (Шутка.)

string address = "Лондон, улица Бейкер-стрит";
string updated = address.Replace("Лондон", "Париж");
Console.WriteLine(updated); // "Париж, улица Бейкер-стрит"
Замена подстроки с помощью Replace
  • Можно заменить даже отдельные символы: str.Replace('а', 'я')
  • Важно: все замены происходят во всей строке, а не только в первом вхождении.

3. Метод Split: разрезаем строку на кусочки

Метод Split делает следующее: берёт вашу строку и режет её на части, используя разделители — символы или строки, по которым нужно разбивать. Метод возвращает массив строк, на которые он порезал исходную строку.

string[] parts = originalString.Split(separator);
Синтаксис метода Split
  • separator — символ или массив символов, которые будут использоваться в качестве разделителя.

Самый простой пример

Разделим строку по пробелу:

string input = "яблоко груша апельсин банан";
string[] fruits = input.Split(' '); 	// содержит массив ["яблоко","груша","апельсин","банан"]
Console.WriteLine(fruits[0]); 			// "яблоко"
Console.WriteLine(fruits[1]); 			// "груша"

Здесь мы получили массив строк длиной 4, где каждое слово — отдельный элемент массива.

Несколько разделителей

Иногда в строке может быть не только один вид разделителя. Например, пользователь мог ввести значения через пробел, запятую или точку с запятой.

В таких случаях можно использовать массив символов-разделителей:

string input = "яблоко, груша; апельсин банан";
char[] separators = { ' ', ',', ';' };
string[] fruits = input.Split(separators, StringSplitOptions.RemoveEmptyEntries);

Бонус: опциональный параметр StringSplitOptions.RemoveEmptyEntries убирает пустые фрагменты. Это нужно, если пользователь ввёл несколько разделителей подряд — например, два пробела или что-то вроде "яблоко,, груша".

Разделение по подстроке

Разделители могут быть и строками, а не только символами. Например, если у вас CSV-файл с разделителем ";" или |:

// Разделитель по одному символу
string data = "Иванов;Петров;Сидоров";
string[] names = data.Split(';'); // по символу ';'

// Или, если разделитель - целая строка:
string log = "2024-01-01::Ошибка::Не удалось выполнить задачу";
string[] separators = { "::" };
string[] parts = log.Split(separators);

4. Метод Join: собираем массив строк обратно

Метод Join делает обратную работу: принимает массив строк и склеивает их в одну строку, вставляя между элементами выбранный вами разделитель.

string result = string.Join(separator, arrayOfStrings);
Синтаксис метода Join
  • separator — строка, которая будет вставляться между элементами.
  • arrayOfStrings — массив или коллекция строк (string[], List<string> и др.).

Простейший пример

Создадим из массива строк одну строку с запятыми:

string[] items = { "яблоко", "груша", "апельсин", "банан" };
string joined = string.Join(", ", items);
Console.WriteLine(joined); // "яблоко, груша, апельсин, банан"
Объединение массива строк с помощью Join

Объединение с пустым разделителем — сливаем строки в одну

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

string[] parts = { "Я", "люблю", "C#" };
string message = string.Join("", parts);
Console.WriteLine(message); // "ЯлюблюC#"
Объединение строк без разделителя

5. Типичные ошибки

Очень часто начинающие разработчики сталкиваются с тем, что забывают убрать лишние пробелы после разделения строки методом Split. Например, если у пользователя рука дрогнула, и он написал "яблоко, груша ,банан", то после Split получатся элементы вроде " груша ". Если сразу конвертировать в числа или использовать сравнение, будет баг. Используйте Trim() после Split для каждого элемента — это хорошая привычка.

Второй момент — лишние пустые строки. Когда пользователь ввёл два разделителя подряд или начал и закончил строку разделителем, Split может вернуть пустые элементы. Включайте StringSplitOptions.RemoveEmptyEntries, чтобы не ловить потом ошибки.

Если массив для Join содержит пустые элементы или null, то Join их просто проигнорирует. Но если вы этого не хотите (например, для отчёта важно показать, что некоторые значения были пропущены), придётся сначала обработать массив вручную.

И ещё: Split никогда не изменяет исходную строку, а возвращает новый массив. Join также не изменяет исходный массив, а выдаёт новую строку. Помните: строки и массивы в C# — иммутабельны (неизменяемы).

2
Задача
C# SELF, 9 уровень, 4 лекция
Недоступна
Замена подстроки в тексте с помощью метода Replace
Замена подстроки в тексте с помощью метода Replace
2
Задача
C# SELF, 9 уровень, 4 лекция
Недоступна
Разделение строки на части и их объединение
Разделение строки на части и их объединение
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
whynot00 Уровень 1
15 сентября 2025
не до конца понятно, как устроены строки в C# под капотом, строки вроде бы как неизменяемые, получается если следовать совету

Используйте Trim() после Split для каждого элемента — это хорошая привычка.
, получается при каждом использовании метода Trim(), создается новая строка. Сработает ли сборщик мусора нормально или есть вероятность утечки памяти?
Александр Уровень 24
18 октября 2025
он сработает, если на объект не будет ссылок. Однако, если не ошибаюсь, он может ни разу не вызваться, пока всю выделенную память не скушаешь
Ra Уровень 35 Student
7 сентября 2025
Массивы в C# — иммутабельны ? WTF?
Yurii N Уровень 51
29 декабря 2025
Верно подмечено. Строки в C# иммутабельны, массивы — мутабельны, но имеют фиксированный размер.