

Строки в С#
ссылке на объекты типа string), а иначе они для нашей программы будут потеряны (ими займется сборщик мусора).
Если нужно искать в тексте не фрагмент, а одиночный символ, то можно воспользоваться перегруженным вариантом метода IndexOf() принимающим символ в качестве первого параметра:
string Text = "Moscow"; char ch = 's';
int ind;
ind = Text.IndexOf( ch, 0 );
В результате выполнения данного фрагмента кода переменная ind станет равной 2, так как символ 's' входит в строку "Moscow" напозициис индексом 2.
Метод IndexOf() выполняет поиск с учетом регистра символов. Если нужно выполнить поиск без учета регистра символов, то можно исходный текст и искомый фрагмент привести сначала к одному и тому же регистру с помощью методов ToLower() или ТоUрреr() класса
String
Text = Text.ToUpper();
Frag = Frag.ToUpper();
итолько потомвыполнить поиск методом IndexOf ().
Про работу иных методов класса String всегда можно узнать в справочной системе компилятораMicrosoft Visual С#.
4 Массивы строк в языке С#
Строки являются важным, можно сказать инфраструктурным типом языка С#. Многие программы, не направленные на обработку текстов как главную цель своей деятельности, все равно вынуждены работать с текстовыми строками, ибо общаться с пользователем удобно именно в текстовой форме. Для этого они хранят изрядноеколичество текстовых сообщений. Все эти сообщения удобнохранить централизованнов видеодногомассива строк.
Массивы строк можно создать либо следующимподробным кодом:
string[] strArr = null; strArr = new string[3]; strArr[0] = "first"; strArr[1] = "second"; strArr[2] = "third";
либоприменить болеекороткую «инициализационную» форму:
string[] strArr = new string[3]{"first","second","third"};
17

Строки в С#
В любом случае массив strArr [] после этого содержит три элемента, каждый из которых является ссылкой на объект-строку в памяти компьютера, что с помощью окна Quick Watch визуализируется достаточнонаглядно .
Рисунок 11
Проще простого вывести для обозрения содержимое массива strArr и в собственной программе:
Листинг 11
namespace string_app
{
class Program
{
static void Main(string[] args)
{
string[] strArr = new string[3] { "second", "first", "third" }; for (int i = 0; i < strArr.Length; ++i)
Console.WriteLine(strArr[i]);
}
}
}
Абсолютно очевидный и ожидаемый нами результат ее вывода в консольное окно показан нарис. 12.
Рисунок 12
Если перед выводом содержимого массива строк отсортировать его статическим методом
Sort () классаArray
18

Строки в С#
Array.Sort( strArr );
то выводстрок будет осуществлён в лексикографическомпорядке (см. рис. 13).
Рисунок 13
Мы специально в учебных целях в Листинге 11 применили операцию индексации для доступа к отдельным строкам массива strArr. На самом деле этот доступ удобнее и проще осуществлять в цикле foreach, пример использования которого мы рассмотрим чуть ниже, а сейчас мы поступим (опять-таки в учебных целях) прямо наоборот - пойдём ещё более трудным и громоздким путём, осуществляя вывод строк массива strArr посимвольно (с теми же самыми картинкамив консольномокне, что показаны нарис. 12 или 13):
Листинг 12
1. |
for( |
int i = |
0; |
i |
< strArr.Length; ++i |
) |
2. |
{ |
int j |
= 0; |
j |
< strArr[i].Length; |
++j ) |
3. |
for( |
4.Console.Write( strArr[i][j] );
5.Console.WriteLine();
6.}
Здесь методWrite () осуществляет выводсимволов (представлены выражением strArr [ i ] [ j]) i-ой строки массива в одну и ту же физическую строку экрана, после чего метод WriteLine() переходит к следующей физической строке (то есть осуществляет «перевод строки»).
Как мы и обещали выше, сразу же послеучебныхупражнений в техническихусложнениях кодаЛистинга 12 перейдёмк егопрактическому упрощения с помощью цикла foreach:
foreach( string el in strArr ) Console.WriteLine( el );
Действительно, все кратко, просто и наглядно, и, разумеется, этот вариант наиболее предпочтителенв реальномпрактическомкоде.
Цикл foreach как нельзя лучше подходит для решения задачи о расщеплении текстовой строки на отдельные её фрагменты, отделённые друг от друга так называемыми разделителями (separators). К стандартным разделителям относят точку, запятую и пробел, но
19

Строки в С#
в методе Split(), выполняющем данную задачу, их можно указать явно в качестве второго параметра:
Листинг 13
7. namespace string_app
1.{
2.class Program
3.{
4.static void Main(string[] args)
5.{
6.string str = "second, first, third";
7.char[] sep = new char[3] { '.', ',', ' ' };
8.foreach (string s in str.Split(sep))
9.Console.WriteLine(s);
10.}
11.}
12.}
Программа с Листинга 13 разбивает с помощью метода Split() библиотечного класса String
исходную строку "second, first, third" на три подстроки ("second", "first" и "third"), и с помощью цикла foreach выводит каждую изнихв консольноеокно.
5 Краткие выводы
Строка в C# — это массив знаков, объявленный с помощью ключевого слова string.
Строковый литералобъявляется с помощью кавычек, как показанов следующемпримере.
string s = "Hello, World!";
Переприсваивание Строки можноцеликомпереприсваивать:
string s1 = "Hello";
string s2 = s1; //переприсваиваем
Объединение строк Можно объединять строки с помощью оператора+, как показанов следующемпримере:
string s1 = "orange"; string s2 = "red"; s1 += s2;
Console.WriteLine(s1); // напечатается "orangered"
Escape-знаки
20

Строки в С#
Строки могут содержать escape-знаки, такиекак "\n" (новая строка) и "\t" (табуляция). Пример:
string hello = "Hello\nWorld!"; Console.WriteLine(hello);
/* Напечатается Hello
World!
*/
string s = "чтобы вставить \"кавычки\" в строку используем обратный слэш"; Console.WriteLine(s);
Если требуется добавить в строку обратную косую черту, перед ней нужно поставить еще одну обратную косую черту. Следующая строка:
string filePath = "\\\\My Documents\\"; Console.WriteLine(filePath);
/* Напечатается: \\My Documents\ */
Точные строки: символ @
Символ @ служит для того, чтобы конструктор строк пропускал escape-знаки и переносы строки. Следующиедвестроки являются идентичными:
string p1 = "\\\\My Documents\\My Files\\"; string p2 = @"\\My Documents\My Files\";
Чтобы поставить в точной строке знак двойных кавычек, нужно использовать по дватаких знака, как показанов следующемпримере:
string s = @"You say ""goodbye"" and I say ""hello""";
Доступ к отдельным знакам
Квадратные скобки [] служат для доступа к отдельным знакам в объекте string, но при этом возможендоступ толькодля чтения:
string str = "test";
char x = str[2]; // x = 's'; string s5 = "Printing backwards"; for (int i = 0; i < s5.Length; i++)
Console.Write(s5[s5.Length - i - 1]); // напечатается "sdrawkcab gnitnirP"
21

Строки в С#
Извлечение подстрок
Для извлечения подстроки из строки используется методSubstring.
string s3 = "Visual C# Express";
string s4 = s3.Substring(7, 2); Console.WriteLine(s4);
// напечатается "C#"
Замена по образцу
Для замены подстроки в строкепообразцу используется методReplace.
string s3 = "Visual C# Express";
string s5 = s3.Replace("C#", "Basic"); Сonsole.WriteLine(s5);
// напечатается "Visual Basic Express"
Смена регистра
Чтобы изменить регистр букв в строке (сделать их заглавными или строчными) следует использовать ToUpper() или ToLower(), как показанов следующемпримере:
string s6 = "РгРтУ"; Console.WriteLine(s6.ToUpper()); // Напечатается РГРТУ Console.WriteLine(s6.ToLower());
//Напечатается ргрту Console.WriteLine(s6);
//Напечатается РгРтУ
Сравнения
Самый простой способ сравнения двух строк — использовать операторы == и !=, осуществляющие сравнение с учетомрегистра:
string color1 = "red"; string color2 = "green"; string color3 = "red"; if (color1 == color3)
Console.WriteLine("Строки равны"); if (color1 != color2)
Console.WriteLine("Строки не равны");
Не допускается использование >,<,>=,<= для сравнения строк. Для строковых объектов существует метод CompareTo(), возвращающий целочисленное значение, зависящее от того,
22

Строки в С#
что одна строка может быть меньше (<), равна (==) или больше другой (>). При сравнении строк используется значение Юникода, при этом значение строчных букв меньше, чем значениезаглавных.
string string1 = "ИИТ"; string string2 = "Иит";
int result = string1.CompareTo(string2); if (result > 0)
Console.WriteLine("{0} больше чем {1}", string1, string2); else if (result == 0)
Console.WriteLine("{0} равно {1}", string1, string2); else if (result < 0)
Console.WriteLine("{0} меньше чем {1}", string1, string2); // Напечатается ИИТ больше чем Иит
Удаление фрагментов и вставка строк в строки
Может быть выполненас помощью методов Remove и Insert:
string x = "ZX Spectrum"; x=x.Remove(2, 1);
x = x.Insert(2,"-"); Console.WriteLine(x); Console.ReadKey();
Пустые строки
Пустая строка — это экземпляробъекта String, содержащий0 знаков.
Пустые строки часто используются в различных сценариях программирования, представляя пустое текстовое поле. Для пустых строк можно вызывать методы, потому что такие строки являются допустимыми объектами String. Пустые строки инициализируются следующимобразом:
string s = "";
Массивы из строк
Могут быть инициализированы начальными значениями:
string[] x = { "Астраханская обл.", "Знаменск"}; Console.WriteLine(x[0]);
//напечатается Астраханская обл. Console.WriteLine(x[1][0]);
23

Строки в С#
//напечатается З
Разбиение строк
Следующий пример кода демонстрирует возможность разбора строки при помощи метода String.Split. Работа метода заключается в возврате массива строк, в котором каждый элемент представляет слово. В качестве ввода Split принимает массив символов, определяющихкакие символы должны использоваться в качестве разделителей. В этом примере используются пробелы, запятые, точки, двоеточия и табуляция. Массив, содержащий эти разделители, передается в Split, и каждое слово в предложении выводится отдельно при помощи результирующегомассива строк.
Пример: разбить предложениенаслова
char razdelitel = ' ';
string text = "Шла Саша по шоссе и сосала сушку"; Console.WriteLine("Исходный текст: {0}", text); string[] words = text.Split(razdelitel); Console.WriteLine("{0} слов в тексте:", words.Length); foreach (string s in words)
Console.WriteLine(s);
В качестве разделителя может выступать массив символов.
char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; string text = "one\ttwo three:four,five six seven"; Console.WriteLine("Original text: '{0}'", text); string[] words = text.Split(delimiterChars); Console.WriteLine("{0} words in text:", words.Length); foreach (string s in words)
Console.WriteLine(s);
Пример: Ввести текстовую строку. Напечатать слова, в которых первая буква встречается ещехотя бы раз.
Console.Write("Введите предложение: "); string s=Console.ReadLine();
string[] words= s.Split(' ','.',','); foreach (string word in words)
{
char c=word[0]; bool flag = false; int i=1;
while (i < word.Length & !flag)
{
if (word[i] == c) flag = true; i++;
24