Урок 7. Строки — методы и приёмы
Строки — самый частый тип данных после чисел: имена, сообщения, ввод с клавиатуры, содержимое файлов. В этом уроке — что можно делать со строкой и какие у неё особенности.
Строка и её символы
Строка string — последовательность символов char. Длину даёт Length, отдельный символ — индекс в квадратных скобках, как у массива; индексы с нуля.
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' — разные типы.
Поиск, вырезание и замена
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| Метод | Что делает |
|---|---|
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# неизменяемы: ни один метод не меняет саму строку, все возвращают новую. Частая ошибка — вызвать метод и не сохранить результат:
string word = "шарп";
word.ToUpper();
Console.WriteLine(word);
word = word.ToUpper();
Console.WriteLine(word);шарп
ШАРППоменять один символ через индекс тоже нельзя: word[0] = 'Ш'; — ошибка компиляции. Нужна новая строка, например word = "Ш" + word.Substring(1);. Если строку собирают из тысяч кусочков в цикле, удобнее StringBuilder.
Split и Join
Split делит строку на массив кусков по разделителю, string.Join — склеивает обратно:
string line = "яблоко, груша, слива";
string[] fruits = line.Split(", ");
Console.WriteLine(fruits.Length);
foreach (string f in fruits)
{
Console.WriteLine(f);
}
Console.WriteLine(string.Join(" | ", fruits));3
яблоко
груша
слива
яблоко | груша | сливаРазделителем может быть символ (Split(' ')) или строка (Split(", ")). Если между словами бывает по несколько пробелов, добавьте StringSplitOptions.RemoveEmptyEntries, иначе в массиве окажутся пустые строки.
Перебор символов
По строке можно пройти циклом foreach, как по массиву. Например, посчитать гласные:
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) делает букву большой.
Перевернуть строку
Готового метода «перевернуть» у строки нет. Строку переводят в массив символов, переворачивают его и собирают новую строку:
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) (второй считает пустой и строку из одних пробелов):
string input = " ";
Console.WriteLine(string.IsNullOrEmpty(input));
Console.WriteLine(string.IsNullOrWhiteSpace(input));False
TrueЧастые ошибки
- Вызвали
s.Trim()илиs.Replace(...)и не сохранили результат — строка не изменилась. Substringза пределами строки:"abc".Substring(2, 5)— ошибкаArgumentOutOfRangeException. Длина куска не должна выходить за конец строки.- Сравнение без учёта регистра через
==:"Да" == "да"—false. Правильные способы — в справке Как сравнить строки. - Строка из цифр — это не число:
"5" + "3"— это"53". Сначалаint.Parse.
Коротко
s.Length— длина,s[i]— символ (char),s[^1]— последний.Contains,IndexOf,Substring,Replace,Trim,ToUpper— каждый возвращает новую строку или ответ.- Строки неизменяемы:
s = s.ToUpper();, а не простоs.ToUpper();. Splitделит строку на массив,string.Joinсклеивает.- Пустая строка и
null— разные вещи;string.IsNullOrWhiteSpaceпроверяет оба случая.