Глиф Учебники

Урок 7. Строки — методы и приёмы

Курс «C#» · урок 7 из 10 · 3 минуты чтения

Строки — самый частый тип данных после чисел: имена, сообщения, ввод с клавиатуры, содержимое файлов. В этом уроке — что можно делать со строкой и какие у неё особенности.

Строка и её символы

Строка string — последовательность символов char. Длину даёт Length, отдельный символ — индекс в квадратных скобках, как у массива; индексы с нуля.

C#
string s = "Привет, мир";
Console.WriteLine(s.Length);
Console.WriteLine(s[0]);
Console.WriteLine(s[^1]);
Console.WriteLine(s.ToUpper());
Console.WriteLine(s.ToLower());
Вывод
11
П
р
ПРИВЕТ, МИР
привет, мир

s[^1] — первый символ с конца, то есть последний. Пробел и запятая — тоже символы, поэтому длина 11. Строка в двойных кавычках — string, один символ в одинарных — char: "a" и 'a' — разные типы.

Поиск, вырезание и замена

C#
string s = "Привет, мир";
Console.WriteLine(s.Contains("мир"));
Console.WriteLine(s.IndexOf("мир"));
Console.WriteLine(s.IndexOf("кот"));
Console.WriteLine(s.Substring(8));
Console.WriteLine(s.Substring(0, 6));
Console.WriteLine(s.Replace("мир", "C#"));
Console.WriteLine(s.StartsWith("При"));
Вывод
True
8
-1
мир
Привет
Привет, C#
True
s 0 П 1 р 2 и 3 в 4 е 5 т 6 , 7 8 м 9 и 10 р IndexOf("мир") → 8 Substring(0, 6) "Привет" Substring(8) "мир" s.Length — 11: пробел и запятая тоже символы
Символы строки «Привет, мир» пронумерованы с нуля: «мир» начинается с индекса 8, Substring(0, 6) берёт шесть символов с начала, а Substring(8) — всё от индекса 8 до конца.
МетодЧто делает
Contains(x)есть ли x в строке
IndexOf(x)где x начинается, или −1, если его нет
Substring(start)кусок от start до конца
Substring(start, length)кусок длиной length от start
Replace(a, b)все a заменены на b
StartsWith(x), EndsWith(x)начинается ли, заканчивается ли на x
Trim()без пробелов в начале и в конце
ToUpper(), ToLower()все буквы большие, маленькие

Строку нельзя изменить

Строки в C# неизменяемы: ни один метод не меняет саму строку, все возвращают новую. Частая ошибка — вызвать метод и не сохранить результат:

C#
string word = "шарп";
word.ToUpper();
Console.WriteLine(word);
word = word.ToUpper();
Console.WriteLine(word);
Вывод
шарп
ШАРП
word.ToUpper(); word "шарп" осталась прежней ToUpper() "ШАРП" не сохранена word = word.ToUpper(); word word "шарп" забыта ToUpper() "ШАРП" новая строка
ToUpper не меняет строку, а создаёт новую: без присваивания новая строка теряется, а после word = word.ToUpper() переменная word указывает уже на неё.

Поменять один символ через индекс тоже нельзя: word[0] = 'Ш'; — ошибка компиляции. Нужна новая строка, например word = "Ш" + word.Substring(1);. Если строку собирают из тысяч кусочков в цикле, удобнее StringBuilder.

Split и Join

Split делит строку на массив кусков по разделителю, string.Join — склеивает обратно:

C#
string line = "яблоко, груша, слива";
string[] fruits = line.Split(", ");
Console.WriteLine(fruits.Length);
foreach (string f in fruits)
{
    Console.WriteLine(f);
}
Console.WriteLine(string.Join(" | ", fruits));
Вывод
3
яблоко
груша
слива
яблоко | груша | слива
"яблоко, груша, слива" строка line.Split(", ") fruits "яблоко" "груша" "слива" [0] [1] [2] массив string.Join(" | ", fruits) "яблоко | груша | слива" строка
Split режет строку по разделителю «, » на массив из трёх строк, а string.Join склеивает элементы обратно и ставит между ними « | ».

Разделителем может быть символ (Split(' ')) или строка (Split(", ")). Если между словами бывает по несколько пробелов, добавьте StringSplitOptions.RemoveEmptyEntries, иначе в массиве окажутся пустые строки.

Перебор символов

По строке можно пройти циклом foreach, как по массиву. Например, посчитать гласные:

C#
string text = "Программирование на C#";
int vowels = 0;
foreach (char c in text.ToLower())
{
    if ("аеёиоуыэюя".Contains(c))
    {
        vowels++;
    }
}
Console.WriteLine(vowels);
Вывод
8

У типа char есть полезные проверки: char.IsDigit(c) — цифра ли, char.IsLetter(c) — буква ли, char.IsUpper(c) — большая ли, char.IsWhiteSpace(c) — пробел ли. А char.ToUpper(c) делает букву большой.

Перевернуть строку

Готового метода «перевернуть» у строки нет. Строку переводят в массив символов, переворачивают его и собирают новую строку:

C#
string s = "привет";
char[] chars = s.ToCharArray();
Array.Reverse(chars);
string reversed = new string(chars);
Console.WriteLine(reversed);
Console.WriteLine(s == reversed ? "палиндром" : "не палиндром");
Вывод
тевирп
не палиндром

Для слова "топот" перевёрнутая строка совпала бы с исходной — это палиндром.

Пустая строка и null

Пустая строка "" — строка без символов, её длина 0. null — строки нет вовсе: у такой переменной нельзя спросить даже Length — программа остановится с NullReferenceException. Проверить оба случая сразу помогают string.IsNullOrEmpty(s) и string.IsNullOrWhiteSpace(s) (второй считает пустой и строку из одних пробелов):

C#
string input = "   ";
Console.WriteLine(string.IsNullOrEmpty(input));
Console.WriteLine(string.IsNullOrWhiteSpace(input));
Вывод
False
True

Частые ошибки

Коротко

Проверьте себя

1. Что выведет Console.WriteLine("кошка".Substring(1, 3));?
2. Что выведет программа?
C#
string s = "мир";
s.ToUpper();
Console.WriteLine(s);
3. Что вернёт "Привет".IndexOf("z")?
4. Чем 'a' отличается от "a"?