Приветствую всех, сегодня поговорим о строках. Все мы так или иначе используем string в своих приложениях. Но у начинающих программистов возникают проблемы в понимании и с работой с этим типом. Строку можно представить в виде массива символов, однако это не так, так как строки являются ссылочными типами. Строка неизменна, каждый раз когда мы пытаемся изменить строку, старая стерается и создается новая. Так как строки являются ссылочными типами они находятся в куче.
Объявление и инициализация строк:
1 2 3 4 5 6 |
string str; string str1 = "hello"; string str2 = null; string str3 = new String('X', 3); // результатом будет строка "XXX" string str4 = new String(new char[] { 'n', 'o', 'o', 'k', 'e', 'r', 'y', }); |
Как из строки по индексу получить символ?
1 2 3 |
string s1 = "nookery"; char ch1 = s1[4]; // символ 'e' Console.WriteLine(ch1); |
Так как мы знаем что строка, состоит из символов, то нам достаточно указать какой индекс символа нас интересует в строке и мы можем его вывести либо сохранить в переменной, что я и сделал. Однако изменить символ в строке нельзя, так как это не ссылочный тип переменных, для изменения данных в строке необходимо использовать доступные для этого методы.
Как найти символ или целое слово в строке?
1 2 3 4 |
string str = "nookery it's fun!"; char ch = 'y'; int indexOfChar = str.IndexOf(ch); // равно 6 Console.WriteLine(indexOfChar); |
Мы создали строку, и указали в качестве поиска символ y воспользовались методом IndexOf(); и сохранили результат в целочисленной переменной. Результат стал цифра 6, так как первое вхождение символа y было по индексу 6.
Так же мы можем осуществить не только поиск символа но и подстроки, в примере ниже мы из строки предложения, найдем целое слово!
1 2 3 4 |
string str = "nookery it's fun!"; string subString = "fun"; int indexOfSubstring = str.IndexOf(subString); // равно 13 Console.WriteLine(indexOfSubstring); |
Мы в примере выше, воспользовались тем же метод IndexOf(); который принял другой аргумент, так как он имеет ряд перегрузок. И сохранили индекс вхождения слова в строку.
Еще одним часто используемым методом строк является StartsWith(); Который вернет true если слово в строке было найдено, в противном случаи false, таким образом этот метод можно использовать для поиска слова в тексте.
1 |
if(dg.StartsWith("nookery")) |
Как разбить строку на слова?
В следующем примере возьмем строку и разобьем ее на слова сохраним в массив и выведем в консоль. А воспользуемся мы методом Split(); который принимает в качестве аргумента символ, в нашем случаи пробел.
1 2 3 4 5 6 |
string str = "nookery it's fun!"; string[] text = str.Split(' '); foreach (string s in text) { Console.WriteLine(s); } |
Метод Split(); возвращаем строковый массив, содержащий подстроки данного экземпляра, разделенного элементами заданного массива.
Однако этот метод не на столько хорош, как хотелось бы, потому что в строке между словами могло быть больше пробелов и соответственно это повлияло бы на разделения слов. Так как один пробел это один символ, два пробела два символа. А по этому лучше воспользоваться другим примером для разделения строки на слова:
1 2 3 4 5 6 |
string str = "nookery it's fun!"; string[] text = str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); foreach (string s in text) { Console.WriteLine(s); } |
В данном примере мы воспользовались другой перегрузкой метода Split(); первый аргумент символ пробела остался не измененным, но добавился второй аргумент StringSplitOptions.RemoveEmptyEntries который позволяет удалить все пустые подстроки.
Как обрезать или удалить символ в строке?
Для этого воспользуемся методом Trim(); Который позволяет без параметров удалить пробелы в начале и в конце строки, однако он имеет ряд полезных перегрузок одна из них, удаление в начале или в конце строки заданного символа.
1 2 3 4 |
string text = " nookery it's fun! "; text = text.Trim(); // результат "hello world" text = text.Trim(new char[] {'n','!'}); // результат "ookery it's fu" |
Для обрезки определенной части строки воспользуйтесь методом Substring(), имеет он два перегруженных метода, которые позволяют удалить до указанной позиции в начале строки и вторая перегрузка метода позволяет удалить с конца строки до указанной позиции символы.
1 2 3 4 5 6 7 8 9 |
string str = "nookery it's fun!"; // обрезаем строку до третьего символа str = str.Substring(2); // результат "okery it's fun!" Console.WriteLine(str); // обрезаем последние два символа str = str.Substring(0, str.Length - 2); // результат "okery it's fu" Console.WriteLine(str); |
Как вставить слово в строку в определенное место?
В этом примере мы рассмотрим метод Insert(); который позволяет вставить в строку по индексу подстроку.
1 2 3 4 |
string str = "nookery fun!"; string subString = "it's"; str = str.Insert(8, subString); Console.WriteLine(str); |
Как видно из примера первый аргумент, это индекс с которого будет происходить вставка подстроки, а второй аргумент и есть сама подстрока.
Как удалить часть строки?
В этом нам поможет метод Remove(); Рассмотрим пример ниже:
1 2 3 4 5 6 7 8 9 10 11 |
string str = "nookery fun!"; // индекс последнего символа int i = str.Length - 1; //удаляем последний символ str= str.Remove(i); Console.WriteLine(str); // удаляем первые два символа str = str.Remove(0, 2); Console.WriteLine(str); |
Как заменить слово в строке целиком?
Сейчас рассмотрим как можно в строке заменить полностью слово на другое. Для этого воспользуемся методом Replace();
1 2 3 |
string str = "nookery it's fun!"; str= str.Replace("fun!","super!"); Console.WriteLine(str); |
В качестве первого аргумента метод принимает слово которое требует замены, если оно есть он поменяет его на слово которое во втором аргументе. Я этот метод еще использую когда требуется удалить определенное слово в строке. Для этого достаточно вторым аргументом в методе указать «» и ваше слово будет удаленно, можно так же им воспользоваться для удаления пробелов.
Как изменить регистр букв в строке на заглавные или прописные?
Это один из часто используемых методов ToLower(); ToUpper(); которые позволяют всю строку преобразовать в заглавную или прописную строку.
1 2 3 |
string str = "nookery it's fun!"; Console.WriteLine(str.ToLower()); // nookery it's fun! Console.WriteLine(str.ToUpper()); // NOOKERY IT'S FUN! |
Конкатенация строк!
В заключительной части со строками хотелось затронуть не маловажную роль конкатенации. Когда вы имеете две и более строк и вам необходимо их объединить, обычно мы используем оператор +
1 2 |
string str = "nookery"; str+="it's fun!"; |
Однако использовать их в длительных циклах, является грубой ошибкой и беспечностью, дело в том что в циклах таким образом создаются каждый раз новые экземпляры строки, тем самым увеличивая память, и уменьшает производительность программы. В этом можно убедиться в примере ниже:
1 2 3 4 5 |
string str = ""; for (int i = 0; i < 500000; i++) { str += i.ToString() + ", "; } |
Что бы избежать подобного рода ошибок необходимо использовать класс StringBuilder(); и его методы, в примере продемонстрирован пример с верху но с использованием класса StringBuilder();
1 2 3 4 5 6 |
var builder = new StringBuilder(); for (int i = 0; i < 500000; i++) { builder.Append(i); builder.Append(", "); } |
Интересной особенностью использования StringBuilder является еще одна фишка, можно сокращать длину строки следующим образом:
1 2 3 4 5 6 |
var builder = new StringBuilder(); builder.Append("Приветствую вас на сайте nookery"); builder.Length -= 7; st.Length -= 10; //Вывод //Приветствую вас на сайте |
Что интересно такой вариант не прокатит с обычными строками)