Лекция 8. Строки
Для работы со строками в языке C# существует несколько возможностей:
o используя символьный тип char(символ), который соответствует классу System.Char, для организации строки – массив символов типа char, который соответствует классу System.Array
o используя строки типа string
o используя строки типа StringBuilder
Работа с символами в С#
Символьный тип char предназначен для хранения символов в кодировке Unicode. Символьный тип относится к встроенным типам данных C# и соответствует классу System.Char. В этом классе определены статические методы, позволяющие задать вид и категорию символа, а также преобразовать символ в верхний или нижний регистр и в число. В таблице 8.1 представлены основные методы класса System.Char.
Таблица 8.1 – Основные методы класса System.Char
Метод | Описание |
GetNumericValue | Возвращает числовое значение символа, если он является цифрой, и -1 в противном случае |
GetUnicodeCategory | Возвращает категорию Unicode-символа(Bce Unicode-символы разделены на категории, например, десятичные цифры (Decimal-DigitNumber), римские цифры (LetterNumber), разделители строк (LineSeparator), буквы в нижнем регистре (LowercaseLetter) и т. д.) |
IsControl | Возвращает true, если символ является управляющим |
IsDigit | Возвращает true, если символ является десятичной цифрой |
IsLetter | Возвращает true, если символ является буквой |
IsLetterOrDigit | Возвращает true, если символ является буквой или цифрой |
IsLower | Возвращает true, если символ задан в нижнем регистре |
IsNumber | Возвращает true, если символ является числом (десятичным или шестнадцатеричным) |
IsPunctuation | Возвращает true, если символ является знаком препинания |
IsSeparator | Возвращает true, если символ является разделителем |
Is Upper | Возвращает true, если символ записан в верхнем регистре |
IsWhiteSpace | Возвращает true, если символ является пробельным (пробел, перевод строки и возврат каретки) |
Parse | Преобразует строку в символ (строка должна состоять из одного символа) |
ToLower | Преобразует символ в нижний регистр |
ToUpper | Преобразует символ в верхний регистр |
MaxValue, MinValue | Возвращают символы с максимальным и минимальным кодами (эти символы не имеют видимого представления) |
Пример применения методов класса System.Char
|
|
using System;
namespace ConsoleApplicationl
{ class Classl
{ static void Main()
{ try
{
char b = 'В', с = '\x63', d = '\u0032';
Console.WriteLine("{0} {1} {2}",b,c,d);
Console.WriteLine("{0}{1}{2}",char.ToLower(b),char.ToUpper(c), char.GetNumericValue(d));
char a;
do
{
Console.Write("Введите символ: ");
a = char.Parse(Console.ReadLine());
Console.WriteLine("Введен символ {0}, его код - {1}", a, (int)a);
if (char.IsLetter(a)) Console.WriteLine("Буква");
if (char.IsUpper(a)) Console.WriteLine("Верхний peгистр");
if (char.IsLower(a)) Console.WriteLine("Нижний peгистр");
if (char.IsControl(a)) Console.WriteLine("Управляющий");
|
|
if (char.IsNumber(a)) Console.WriteLine("Число");
if (char.IsPunctuation(a)) Console.WгiteLine("Paздeлитeль");
}
while (a!= 'q');
}
Catch
{
Console.WriteLine("Возникло исключение");
return;
} } } }
В приведенном примере вывод символа сопровождается его кодом в десятичном виде. Для вывода кода используется явное преобразование к целому типу. Явное преобразование из символов в строки и обратно в С# не существует, неявным же образом любой объект, в том числе и символ, может быть преобразован в строку, например:
string s = 'к' + 'о' + 'т'; // результат - строка "кот"
При вводе и преобразовании могут возникать исключительные ситуации, например, если пользователь введет пустую строку. Для «мягкого» завершения программы предусмотрена обработка исключений.
Массивы символов
Массив символов, как и массив любого иного типа, построен на основе базового класса Array, некоторые свойства и методы которого были перечислены в лекции 7. Применение этих методов позволяет эффективно решать задачи на обработку строк.
Пример обработки строк (как массива символов) с применением класса System.Array
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
char[] a = { 'm', 'a', 's', 's', 'i', 'v }; //инициализация массива символов поэлементно
// ТоCharАггау()- метод класса string – разбивает строку на символы
char[] b = "а роза упала на лапу азора".ТоCharАггау();
PrintArray("Исходный массив а:", а);
int pos = Array.IndexOf(a, 'm');
a[pos] = 'M';
PrintArray("Измененный массив а:", а);
PrintArray("Исходный массив b:", b);
Array.Reverse(b );
PrintArray("Измененный массив b:", b);
}
public static void PrintArray(string s, Array a)
{
Console.WriteLine(s);
foreach (object x in a) Console.Write(x);
Console.WriteLine("\n"):
}}}
Строки типа string
Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом С#. Ему соответствует базовый класс System.String библиотеки.NET.
Создать строку можно несколькими способами:
string s; // объявление строки, без выделения памяти
string t = "qqq"; // инициализация строковым литералом
string u = new string (' ', 20); // создание строки из 20 пробелов
char[] а = { '0', '0', '0' }; // создание строки как массива символов и ее инициализация
string v = new string (a); // создание строки из массива символов
Операции над строками
o присваивание (=);
o проверка на равенство (= =);
o проверка на неравенство (!=);
o обращение по индексу ([ ]);
o сцепление (конкатенация) строк (+).
Несмотря на то, что строки являются ссылочным типом данных, на равенство и неравенство проверяются не ссылки, а значения строк.
Строки равны, если имеют одинаковое количество символов и совпадают посимвольно. Обращаться к отдельному элементу строки по индексу можно только для получения значения, но не для его изменения.
В классе System.String предусмотрено множество методов, полей и свойств, позволяющих выполнять со строками практически любые действия. Основные элементы класса приведены в таблице 8.2.
Таблица 8.2 – Основные элементы класса System.String
Метод | Описание |
Compare | Сравнение двух строк в лексикографическом (алфавитном) порядке. Разные реализации метода позволяют сравнивать строки и подстроки с учетом и без учета регистра и особенностей национального представления дат |
CompareOrdinal | Сравнение двух строк по кодам символов. Разные реализации метода позволяют сравнивать строки и подстроки |
CompareTo | Сравнение текущего экземпляра строки с другой строкой |
Concat | Конкатенация (соединение) строк. Метод допускает сцепление произвольного числа строк |
Copy | Создание копии строки |
Empty | Пустая строка (только для чтения) |
Format | Форматирование в соответствии с заданными спецификаторами формата |
IndexOf,IndexOfAny, LastIndexOf, LastIndexOfAny | Определение индексов первого и последнего вхождения заданной подстроки или любого символа из заданного набора |
Insert | Вставка подстроки в заданную позицию |
Intern, IsInterned | Возвращает ссылку на строку, если такая уже существует. Если строки нет, Intern добавляет строку во внутренний пул, Islntern возвращает nul1 |
Join | Слияние массива строк в единую строку. Между элементами массива вставляются разделители |
Length | Длина строки (количество символов) |
PadLeft,PadRight | Выравнивание строки по левому или правому краю путем вставки нужного числа пробелов в начале или в конце строки |
Remove | Удаление подстроки из заданной позиции |
Продолжение таблицы 8.2
|
|
Метод | Описание |
Replace | Замена всех вхождений заданной подстроки или символа новыми подстрокой или символом |
Split | Разделяет строку на элементы, используя заданные разделители. Результаты помещаются в массив строк |
StartWith, EndWith | Возвращает true или false в зависимости от того, начинается или заканчивается строка заданной подстрокой |
Substring | Выделение подстроки, начиная с заданной позиции |
ToCharArray | Преобразование строки в массив символов |
ToLower,ToUpper | Преобразование символов строки к нижнему или верхнему регистру |
Trim,TrimStart,TrimEnd | Удаление пробелов в начале и конце строки или только с одного ее конца (обратные по отношению к методам PadLeft и PadRlght действия) |
Пример обработки строк типа string
using System;
namespace ConsoleApplicationl
{ class Classl
{ static void Main()
{
string s = "прекрасная королева Изольда";
Console.WriteLine(s);
string sub = s.Substring(3).Remove(12, 2);
Console.WriteLine(sub);
string[] mas = s.Split(' ');
string joined = string.Join("! ", mas);
Console.WriteLine(joined);
Console.WriteLine("Введите строку");
string x = Console.ReadLine();
Console.WriteLine("Вы ввели строку " + x);
double a = 12.234;
int b = 29;
Console.WriteLine(" a = {0,6:C} b = {1,2:X}", a, b); //неявный вызов метода Format
Console.WriteLine(" a = {0,6:0.##} b = {1,5:0.# ' руб. '}",a, b);//пользовательский шаблон
Console.WriteLine("a = {0:F3} b = {1:D3}", a, b); //задание ширины дробной части
} } }
прекрасная королева Изольда
красная корова Изольда
прекрасная! королева! Изольда
Введите строку
|
|
не хочу!
Вы ввели строку не хочу!
а = 12,23р. b = 1D
а = 12,23 b = 29 руб.
Форматирование строк
В предыдущем примере неявно применяется метод Format, который заменяет все вхождения параметров в фигурных скобках значениями соответствующих переменных из списка вывода. После номера параметра можно задать минимальную ширину поля вывода, а также указать спецификатор формата, который определяет форму представления выводимого значения.
Спецификатор формата, как явствует из его названия, определяет формат вывода значения. Например, спецификатор С (Currency) означает, что параметр должен форматироваться как валюта с учетом национальных особенностей представления, а спецификатор X (Hexadecimal) задает шестнадцатеричную форму представления выводимого значения. После некоторых спецификаторов можно задать количество позиций, отводимых под дробную часть выводимого значения.