Рядок – це об’єкт типу string(System.String в нотації .Net), який зберігає в собі текстовий рядок. Хоча рядки відносять до примітивних типів даних, насправді вони мають тип за посиланням. Всередині рядків зберігається колекція символів типу char.
Рядок є незмінним об’єктом, це означає, що після створення його не можна змінити, а будь які зміни, до прикладу об’єднання, призводять до створення нового рядку.
Оскільки рядкові змінні дуже часто використовуються в програмування, мова C# містить велику кількість операцій для роботи з рядками.
C# дозволяє читати окремі символи рядка, звертаючись до окремого символу по індексу, при цьому редагування не дозволяється:
var s = "Текст";
for (int i = 0; i < s.Length; i++)
{
Console.WriteLine(s[i]);
}
s[0] = "т"; // помилка, змінити символ в рядку не дозволяється
Створення рядків
Рядок можна створити присвоївши йому значення рядкового літералу, чи за допомогою оператора new:
string text1 = null; //рядок без значення
string text2 = ""; //пустий рядок
string text3 = "Some text";
string text4 = new string('x', 4); //xxxx
string text5 = new string(new[] { 'M', 'e', 's', 's', 'a', 'g', 'e' }); //Message
Пустий рядок та рядок без значення
Пустий рядок – це об’єкт типу string, в якому не міститься символів, його довжина рівна нулю. На відміну від порожнього рядка, рядок без значення (null-string), не містить посилання на об’єкт.
Створити порожній рядок можна одним із способів:
var empty1 = "";
var empty2 = string.Empty;
IsNullOrEmpty - перевірка на пустоту
Для перевірки на null і пустоту, використовується метод IsNullOrEmpty, він повертає true якщо рядок пустий, або рівний null.
string nullString = null;
var b1 = string.IsNullOrEmpty(nullString); //true
var b2 = string.IsNullOrEmpty("test"); // false
IsNullOrWhiteSpace
Метод приймає на вхід рядок і повертає true якщо рядок рівний null, або складається з пробільних символів.
string whiteString = "\t \r\n";
var b1 = string.IsNullOrWhiteSpace(whiteString); //true
var b2 = string.IsNullOrWhiteSpace("123"); // false
Об’єднання рядків
Для конкатенації (об’єднання) рядків, можна використовувати метод Concat, або оператори “+” та “+=”:
string h = "Hello";
string w = "World";
h += " "; //додаємо пробіл
w = w + "!"; //склеюємо зі знаком оклику
Console.WriteLine(string.Concat(h, w)); //склеює два рядки
Для об’єднання послідовності(масиву, колекції) з розділювачем, можна використовувати метод Join:
//перший аргумент - символ розділювача
var t1 = string.Join(",", "1", "2", "3"); //1,2,3
//цілочисельний масив перетворюється в текст
var t2 = string.Join("; ", new[] { 7, 8, 9 }); //7; 8; 9
Зміна регістру
Для перетворення рядків у нижній регістр використовується метод ToLower, у верхній – ToUpper.
var t = "Abdc";
var lower = t.ToLower(); //abcd
var upper = t.ToUpper(); //ABCD
Порівняння рядків
Рівно або Equals
Equals – порівнює на ідентичність два рядки(аналог оператора “==”). При порівнянні враховується регістр символів.
var b1 = "abc" == "abc"; //true
var b2 = "bcd" != "Bcd"; //true
var b3 = "x".Equals("c"); //false
Equals може приймати додатковий аргумент StringComparison, який визначає налаштування порівняння.
Compare
Порівнює значення двох рядків, повертає ціле число:
Число | Значення |
---|---|
Від’ємне | Перший рядок менше другого, або має значення null |
Нуль | Рядки рівні |
Додатне | Другий рядок менше першого, чи має значення null |
порівняння проводиться в порядку сортування, при цьому “A” менше “B”, “D” більше “С”.
int x = string.Compare( "qwerty", "asdfg"); // > 0
CompareOrdinal
Порівняння двох рядків без врахування мови та регіональних параметрів, повертає результат аналогічно попередньому методу.
int y = string.CompareOrdinal( "v", "v"); // == 0
StartsWith
Повертає true якщо рядок починається з підрядка, і іншому випадку false
var st = "0987654321";
bool b = st.StartsWith("09"); //true
EndsWith
Повертає true якщо рядок закінчується на підрядок, в іншому випадку false
var st = "0987654321";
bool b = st.EndsWith("32"); //false
Пошук підрядків
IndexOf
Проводить пошук і повертає позицію початку першого входження підрядка(символа), або -1 якщо нічого не знайдено.
int i1 = "twit".IndexOf("t"); //0
LastIndexOf
Шукає заданий текст в рядку і повертає позицію початку останнього входження підрядку(символу), або -1 якщо нічого не знайдено.
int i2 = "twit".LastIndexOf("t"); //3
Trim - видалення пробілів
Методи для видалення символів-розділення з рядка:
- Trim – видаляє символи з початку і кінця рядка;
- TrimStart – тільки на початку;
- TrimEnd – тільки з кінця;
string s = " 1 Test ";
var trim = s.Trim(); // "1 Test"
var start = s.TrimStart(); // "1 Test "
var end = s.TrimEnd(); // " 1 Test"
var custom = s.Trim(' ', 't'); // "1 Tes"
Ви можете передати в якості аргументу методу, свій набір символів, які потрібно видалити з рядка.
Розділення
Для того, щоб розділити рядок на частини по розділювачу(можна задати декілька відразу), використовують метод Split.
string[] parts = "10,11,12".Split(",");
Якщо таким чином розділити рядок з декількома розділювачами підряд, то в результуючий масив потрапляють пусті рядки. Для виключення такого варіанту, можна скористатися методом Split з параметром StringSplitOptions.RemoveEmptyEntries:
string csv = "a;b;c;;d;f;g;";
string[] parts = csv.Split(";", StringSplitOptions.RemoveEmptyEntries);
foreach(var item in parts)
{
Console.WriteLine(item);
}
Отримання підрядка
Метод Substring дозволяє отримати символ або підрядок з рядка, в якості аргументів задається початковий індекс і довжина(якщо не вказана, то до кінця рядка).
string k = "United Kingdom";
var r1 = k.Substring(0, 6); //United
var r2 = k.Substring(7, 4); //King
var r3 = k.Substring(7); //Kingdom
Редагування рядків
До операцій редагування відносять:
- пошук та заміна;
- вставка підрядка;
- видалення частини рядка;
- функції доповнення.
Заміна
Для заміни символів чи частини рядка, використовується метод Replace, як аргументи він приймає текст для пошуку та текст на який його потрібно замінити(аналог операції знайти і замінити в текстових редакторах):
//заміна слова
string n = "United States";
string m = n.Replace("States", "Kingdom");
Console.WriteLine(m); //United Kingdom
//багатократна заміна символів
var f = "2;4;6;8;10";
Console.WriteLine(f.Replace(";", ", ")); //2, 4, 6, 8, 10
Вставка
Метод Insert призначений для вставки підрядка з вказаної в якості аргументу позиції.
string v = "Some message";
//вставка слова
string p = v.Insert(5, "text");
Console.WriteLine(p); //Some textmessage
//вставляємо пробіл між словами
Console.WriteLine(p.Insert(9, " ")); //Some text message
Видалення
Метод Remove дозволяє видалити частину рядка. В якості аргументів приймає позицію з якої починається видалення, та кількість символів, які потрібно видалити(якщо кількість не вказана, видаляються всі символи до кінця рядка):
string text = "London is the Capital of Great Britain";
//видаляємо слово Great
Console.WriteLine(text.Remove(25, 6));
//залишаємо тільки London
Console.WriteLine(text.Remove(6));
Доповнення рядків
Для доповнення рядка символами до вказаної довжини, використовуються методи:
- PadLeft – повертає новий рядок доповнений зліва вказаними символами;
- PadRight – доповнює вказаними символами справа.
Якщо символ доповнення не вказаний, використовується пробіл.
Ці методи зручно використовувати для виводу чисел та тексту з вирівнюванням:
string[] nums = new[] { "10", "1023", "2" };
//виводимо числа з вирівнюванням по правому краю
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i].PadLeft(4));
}
// Результат
// 10
//1023
// 2
//додавання не значущих нулів до двійкових чисел
string[] binNums = new[] {"101", "111010", "11001"};
for (int i = 0; i < binNums.Length; i++)
{
Console.WriteLine(binNums[i].PadLeft(8, '0'));
}
//00000101
//00111010
//00011001
//доповнення справа
string tree = "|";
for (int i = 1; i < 6; i++)
Console.WriteLine(tree.PadRight(i, '*'));
Робота з рядками
Робота з рядками дуже важлива частина програмування, тому що в будь якій програмі доводиться оперувати текстовими даними. Для цього в C# реалізована велика кількість операцій, які покривають більшу частину потреб при роботі з текстами.
Підведемо підсумки:
- C# пропонує потужні засоби для роботи з рядками, надаючи операції редагування, порівняння, пошуку для текстових значень.
- По скільки тип string є незмінним, редагування рядка символів, призводить до створення нового об’єкта в пам’яті.
- При порівнянні і пошуку, враховується регістр символів та регіональні налаштування, при цьому порівняння відбувається в алфавітному порядку, як це прийнято в сортуванні по зростанню.
- Рядок можна розглядати як символьний масив, до елементів якого, можна звертатися за індексом, при цьому дозволяється тільки читання даних.