Строки – это объект типа 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 является неизменяемым, редактирование строки символов, приводит к созданию нового объекта в памяти.
- При сравнении и поиске, учитывается регистр символов и региональные настройки, при этом сравнение происходит в алфавитном порядке, как это принято в сортировке по возрастанию.
- Строку можно рассматривать как символьный массив, к элементам которого, можно обращаться по индексу, при этом доступно только чтение данных.