1. Вступ
На практиці найчастіше трапляються такі завдання з рядками:
- Дізнатися довжину рядка (і перевірити, чи він не порожній).
- Змінити регістр літер (зробити ВСЕ ВЕЛИКИМИ або все малими).
- Знайти, чи містить рядок потрібне слово або символ.
- Замінити «погане слово» на пристойніше.
- Розбити рядок на частини за роздільником («список телефонів через кому»).
- Видалити пробіли на початку й у кінці рядка.
- Витягти частину рядка (наприклад, перші три літери прізвища).
- Порівняти два рядки — чи збігаються вони, якщо ігнорувати регістр.
І для кожного такого завдання в класі string є відповідний метод.
Таблиця ключових методів
| Операція | Метод/Властивість | Приклад |
|---|---|---|
| Довжина рядка | |
|
| Перший символ | |
|
| Останній символ | |
|
| До нижнього регістру | |
|
| До верхнього регістру | |
|
| Перевірити, чи міститься підрядок | |
|
| Позиція підрядка | |
|
| Витягти частину рядка | |
|
| Порівняти рядки | |
|
| Видалити пробіли | |
|
| Розбити за роздільником | |
|
| Об’єднати масив у рядок | |
|
| Замінити частину | |
|
| Порожній рядок? | |
|
Сьогодні розглянемо деякі з них.
2. Працюємо з рядком як із масивом
Довжина рядка: властивість Length
Найпростіше — дізнатися, скільки символів у рядку. Для цього використовуємо властивість Length. Приклад:
string name = "Аркадій";
Console.WriteLine(name.Length); // Виведе: 7
- Length — це властивість (не метод), тому дужки не потрібні.
- Якщо рядок порожній (""), довжина буде 0.
Іноді корисно перевіряти довжину рядка перед тим, як робити з ним щось «ризиковане» (наприклад, брати підрядок).
Отримання символу за індексом: індексатор [i]
Як при роботі з масивами: рядок — це масив символів. Приклад:
string hello = "Привіт";
char firstChar = hello[0]; // 'П'
char lastChar = hello[^1]; // 'т'
Console.WriteLine(firstChar);
- Індексація починається з нуля!
- Будьте уважні: якщо звернутися до неіснуючого індексу (hello[100]), буде згенеровано виняток.
3. Порівняння рядків
Рядкові оператори == і !=
У мові C# ці оператори просто порівнюють два рядки за їхнім вмістом.
string word1 = "Hello";
string word2 = "Hello";
bool areEqual = word1 == word2; // true
Метод Equals
На відміну від оператора ==, у метод Equals можна передавати параметри. Наприклад, потрібне порівняння без урахування регістру — коли "Мама", "мама" і "МАМА" вважаються рівними. Приклад:
string pass1 = "Qwerty";
string pass2 = "qwerty";
// стандартне порівняння з урахуванням регістру
bool isSame = pass1.Equals(pass2); // false
// порівняння без урахування регістру
bool ignoreCase = pass1.Equals(pass2, StringComparison.OrdinalIgnoreCase); // true
4. Перетворення регістру
Щоб перетворити рядок до верхнього (або нижнього) регістру, в класі string є два спеціальні методи: ToLower() і ToUpper().
Хочете, щоб користувач бачив ваше повідомлення у стилі «ВАЖЛИВО!»? Або потрібно перевести всі імена в нижній регістр для коректного порівняння? Це просто:
string text = "Мені Не Страшний Сірий Вовк!";
Console.WriteLine(text.ToUpper()); // МЕНІ НЕ СТРАШНИЙ СІРИЙ ВОВК!
Console.WriteLine(text.ToLower()); // мені не страшний сірий вовк!
- Зверніть увагу: вихідний рядок не змінюється!
- Можна використати для перевірки збігу рядків без урахування регістру.
5. Видалення зайвих пробілів
А що, якщо користувач випадково (або й навмисно) додав пробіли на початку чи в кінці імені? Trim допоможе! Є три варіанти:
- Trim — видаляє всі пробіли на початку й у кінці рядка;
- TrimStart — видаляє пробіли на початку рядка;
- TrimEnd — видаляє пробіли в кінці рядка.
string raw = " Гоша ";
string cleaned = raw.Trim(); // "Гоша"
Console.WriteLine($"[{cleaned}]");
6. Отримання підрядка: Substring
Іноді потрібно витягти з рядка лише частину.
string word = "Привіт";
string part = word.Substring(2); // "ивіт"
string part2 = word.Substring(2, 3); // "иві"
- Substring(startIndex) — із символу startIndex до кінця.
- Substring(startIndex, length) — починаючи з startIndex стільки символів, скільки вказано в length.
Увага: якщо ви виходите за межі рядка або length < 0, буде згенеровано виняток!
7. Перевірка рядка на порожнечу
Перед використанням рядка (наприклад, в інтерполяції) варто перевірити, що він не дорівнює null і не є порожнім, інакше можна отримати помилку або неочікуваний результат.
a) Перевірка на null за допомогою оператора ==
string s = null;
if (s == null)
Console.WriteLine("Рядок дорівнює null");
Мінус: не враховує порожній рядок ("").
b) Перевірка за допомогою string.IsNullOrEmpty()
Перевіряє і null, і порожній рядок:
string s = "";
if (string.IsNullOrEmpty(s))
Console.WriteLine("Рядок порожній або дорівнює null");
c) Перевірка за допомогою string.IsNullOrWhiteSpace()
Додатково враховує рядки, що складаються лише з пробілів, табуляцій та інших «невидимих» символів:
string s = " ";
if (string.IsNullOrWhiteSpace(s))
Console.WriteLine("Рядок порожній, null або містить лише пробіли");
8. Типові помилки при роботі з рядковими методами
- Найчастіше — забути, що рядки незмінні (immutable), як ми вже з’ясували вище.
- Ще одна популярна помилка — забути про чутливість до регістру під час пошуку та порівняння.
Наприклад, якщо користувач введе імʼя «андрій», а у списку вже є «Андрій», то просте використання Contains або == може не спрацювати, якщо ви не переведете обидва рядки до одного регістру або не скористаєтеся відповідною перевантаженою версією методу.
Також будьте обережні з методами, що повертають індекси. Індекси починаються з нуля, і якщо повернулося -1, це означає, що нічого не знайдено, а не «індекс 0».
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ