Console.WriteLine("Метод IsSeparator:");
Console.WriteLine("sym ' ' - IsSeparator - {0}", char.IsSeparator(' '));
Console.WriteLine("sym ';' - IsSeparator - {0}", char.IsSeparator(lim));
Console.WriteLine("Метод IsSurrogate:");
Console.WriteLine("sym '\u10FF' - IsSurrogate - {0}", char.IsSurrogate('\u10FF'));
Console.WriteLine("sym '\\' - IsSurrogate - {0}", char.IsSurrogate('\\'));
string str = "\U00010F00";
//Символы Unicode в интервале [0x10000,0x10FFF]
//представляются двумя 16-битными суррогатными символами
Console.WriteLine("str = {0}, str[0] = {1}", str, str[0]);
Console.WriteLine("str[0] IsSurrogate - {0}", сhar.IsSurrogate(str, 0));
Console.WriteLine("Метод IsWhiteSpace:");
str ="пробелы, пробелы!" + "\xD" + "\xA" + "Всюду пробелы!";
Console.WriteLine("sym '\xD ' - IsWhiteSpace - {0}", char.IsWhiteSpace('\xD')); Console.WriteLine("str: {0}", str);
Console.WriteLine("и ее пробелы - символ 8 {0},символ 17 {1}",
char.IsWhiteSpace(str,8), char.IsWhiteSpace(str,17));
Console.WriteLine("Метод Parse:");
str="A"; ch = char.Parse(str);
Console.WriteLine("str:{0} char: {1}",str, ch);
Console.WriteLine("Минимальное и максимальное значение:{0}, {1}", char.MinValue.ToString(), char.MaxValue.ToString());
Console.WriteLine("Их коды: {0}, {1}", SayCode(char.MinValue), SayCode(char.MaxValue)); }
Рис. 25. Операции со строками
Кроме статических методов, у класса Char есть и динамические. Большинство из них - это методы родительского класса Object, унаследованные и переопределенные в классе Char.
Метод CompareTo() проводит сравнение символов. Он отличается от метода Equal() тем, что для несовпадающих символов выдает «расстояние» между символами в соответствии с их упорядоченностью в кодировке Unicode.
static void testCompareChars()
{
char ch1, ch2;
int dif;
Console.WriteLine("Метод CompareTo");
ch1='A'; ch2= 'Z';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);
ch1='а'; ch2= 'А';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);
ch1='Я'; ch2= 'А';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);
ch1='A'; ch2= 'A';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);
ch1='А'; ch2= 'A';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);
ch1='Ё'; ch2= 'А';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0}, {1} = {2}", ch1, ch2, dif);
}
Рис. 26. Операции с символами
Строчные буквы в кодировке непосредственно следуют за прописными буквами. Расстояние между алфавитами в кодировке довольно большое - русская буква А на 975 символов правее в кодировке, чем соответствующая буква в латинском алфавите.
Класс Char[] – массив символов, является наследником не только класса Object, но и класса Array, и, следовательно, обладает всеми методами родительских классов.
Например, метод Cop()y дает возможность выделять и заменять подстроку в строке. Методы IndexOf(), LastIndexOf() позволяют определить индексы первого и последнего вхождения в строку некоторого символа. Их нельзя использовать для операции нахождения индекса вхождения подстроки в строку. При необходимости можно написать такую функцию:
int IndexOfStr( char[]s1, char[] s2)
{
//возвращает индекс первого вхождения подстроки s2 в строку s1
int i =0, j=0, n=s1.Length-s2.Length;
bool found = false;
while( (i<=n) && !found)
{
j = Array.IndexOf(s1,s2[0],i);
if (j <= n)
{
found=true; int k = 0;
while ((k < s2.Length)&& found)
{
found =char.Equals(s1[k+j],s2[k]); k++;
}
}
i=j+1;
}
if(found) return(j); else return(-1);
}
Метод IndexOf() класса Array ищет начало совпадения строк, после чего проверяется совпадение остальных символов.
Строки происходят от базового класса – System.String.
Он обеспечивает множество методов, выполняющих черновую работу, табл. 8.
Метод Format(), как и большинство методов, является перегруженным и может вызываться с разным числом параметров. Первый необязательный параметр метода задает провайдера, определяющего национальные особенности, которые используются в процессе форматирования. Это должен быть объект, реализующий интерфейс System.IFormatProvider. Если этот параметр не задан, то используется культура, заданная по умолчанию.
Примеры:
public static string Format(string, object);
public static string Format(IFormatProvider, string, params object[]);
Параметр типа string задает форматируемую строку. Заданная строка содержит 1 или несколько форматов, они распознаются за счет окружающих формат фигурных скобок. Число форматов, вставленных в строку, определяет и число объектов, передаваемых при вызове метода.
Каждый формат определяет форматирование объекта, на который он ссылается и который, после преобразования его в строку, будет подставлен в результирующую строку вместо формата. Метод Format() возвращает переданную ему строку, где все спецификации формата заменены строками, полученными в результате форматирования объектов.
Таблица 8
Член класса |
Назначение |
Length |
Свойство возвращает длину строки |
Empty |
Возвращается пустая строка. Свойство со статусом readonly |
Concat() |
Статический метод возвращает новую строку, склеенную из исходных. Метод перегружен, допускает сцепление произвольного числа строк |
Compare() |
Сравнение двух строк. Метод перегружен. Реализации метода позволяют сравнивать как строки, так и подстроки. При этом можно учитывать или не учитывать регистр, особенности национального форматирования дат, чисел |
CompareOrdinal() |
Сравнение двух строк. Метод перегружен. Реализации метода позволяют сравнивать как строки, так и подстроки. Сравниваются коды символов |
CompareTo() |
Сравнивает 2 строки |
Copy() |
Статический метод создает новую копию существующей строки |
Format() |
Используется для форматирования строки с использованием других примитивов (числовых данных, других строк) и подстановочных выражений вида {0} |
Insert() |
Вставляет строку внутрь существующей |
PadLft() PadRight() |
Методы позволяют заполнить строку указанными символами |
Remove() Replace() |
Методы создают копию строки с внесенными изменениями (удаленными или замененными символами) |
ToUpper() ToLower() |
Методы дают копии строки, в которой все символы станут строчными или прописными |
Trim() TrimStart() TrimEnd() |
Убирает пробелы с двух сторон строки, с начала строки и в конце строки |
Split() |
Выделяет подстроки, ограниченные 1 или несколькими заданными символами, а затем переносит эти подстроки в массив string |
Intern(), IsIntern() |
Отыскивается и возвращается ссылка на строку, если таковая уже хранится во внутреннем пуле данных. Если же строки нет, то первый из методов добавляет строку во внутренний пул, второй - возвращает null. Методы применяются обычно тогда, когда строка создается с использованием построителя строк - класса StringBuilder |
Join |
Конкатенация массива строк в единую строку. При конкатенации между элементами массива вставляются разделители. Операция, заданная методом Join, является обратной к операции, заданной методом Split. |
Объекты класса String объявляются с явной или отложенной инициализацией, с явным или неявным вызовом конструктора класса.
Чаще всего, при объявлении строковой переменной конструктор явно не вызывается, а инициализация задается строковой константой. Но у класса String много конструкторов, позволяющих строить строку из:
- символа, повторенного заданное число раз;
- массива символов char[];
- части массива символов.
Примеры объявления строк:
public void TestDeclStrings()
{
//конструкторы
string world = "Мир";
//string s1 = new string("s1");
//string s2 = new string();
string sssss = new string('s',5);
char[] yes = "Yes".ToCharArray();
string stryes = new string(yes);
string strye = new string(yes,0,2);
Console.WriteLine("world = {0}; sssss={1}; stryes={2};"+" strye= {3}", world, sssss, stryes, strye);
}
Объект world создан без явного вызова конструктора, а объекты sssss, stryes, strye созданы разными конструкторами.
Не допускается явный вызов конструктора по умолчанию - конструктора без параметров. Нет конструктора, которому в качестве аргумента можно передать обычную строковую константу. Соответствующие операторы в тексте закомментированы.
При использовании операций == и != происходит сравнение значений строковых объектов, а не адресов этих объектов в оперативной памяти.
Операция сложения + в С# перегружена так, что при применении к строкам она вызывает метод Concat().
Пример использования членов класса System.String:
System.String strObj = "Это 1-я строка";
string s="Тест";
if (s == strObj)
Console.WriteLine("Одинаковые строки");
else
Console.WriteLine("Разные строки");
string newString = s+strObj;
Console.WriteLine("s + strObj = {0}", newString);
for (int i=0; i<s.Length; i++)
Console.WriteLine("{0}-й символ {1} ", i, s[i]);
Рис. 27. Сравнение строк
Ни один из методов класса String не меняет значения существующих объектов.
Аналогично, при работе со строкой как с массивом, разрешено только чтение отдельных символов, но не их замена.
//Неизменяемые значения
s1= "можно"; ch1 = s1[0];
// s1[0]='L'; ошибка
C# предлагает напрямую, без создания лишних копий, изменять строки. Это средство – класс StringBuilder, определенный в пространстве System.Text.
Все изменения, вносимые в объект этого класса, немедленно в нем отражаются. Часто это оказывается гораздо эффективнее, чем работать с множеством копий.
using System;
using System.Text; // здесь описан класс StringBuilder
namespace ConsoleApplication3
{
class Class1
{
static void Main(string[] args)
{
StringBuilder myBuf = new StringBuilder("Я - буфер");
myBuf.Append(" и меня можно увеличить...");
Console.WriteLine(myBuf);
} }
}
Рис. 28. Строка StringBuilder
В классе StringBuilder можно выполнять непосредственно со строками и другие операции, например, удалять или заменять символы. После обработки такой строки часто бывает удобно содержимое объекта StringBuilder перевести в обычную строку типа string.
using System;
using System.Text; // здесь описан класс StringBuilder
namespace ConsoleApplication3
{
class Class1
{
static void Main(string[] args)
{
StringBuilder myBuf = new StringBuilder("Я - буфер");
myBuf.Append(" и меня можно увеличить...");
Console.WriteLine(myBuf);
myBuf.Append(" и еще увеличить");
Console.WriteLine(myBuf);
string finalString = myBuf.ToString().ToUpper(); //в верх. регистр
Console.WriteLine(finalString);
}
} }
Рис. 29. Пример работы со строкой типа StringBuilder
1. Как задать строковую переменную?
2. Что общего между строкой и массивом символов?
3. Какие методы определены для строк?
4. Для чего используются методы массива символов?
5. Как работает метод Format()?
6. Чем отличается тип String от StringBuilder?
Ознакомиться с теоретическими сведениями. По заданию преподавателя разработать программу и отчет.
Вариант 1
Найти в тексте, вводимом с клавиатуры, самое короткое слово. Предполагается, что слова разделены одним или несколькими пробелами или знаками препинания. Текст вводится с клавиатуры, его длина не превышает 1000 символов.
Вариант 2
Текст вводится с клавиатуры, его длина не превышает 1000 символов. Определить количество символов в самом коротком слове. Слова разделены пробелами и знаками препинания.
Вариант 3
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Определить максимальное количество подряд идущих пробелов. Слова разделены пробелами и знаками препинания.
Вариант 4
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Определить количество вхождений в текст заданного слова. Слова разделены пробелами и знаками препинания.
Вариант 5
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Удалить лишние подряд идущие пробелы. Слова разделены пробелами и знаками препинания.
Вариант 6
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Поменять местами 1-е и последнее слова каждого предложения. Слова разделены пробелами и знаками препинания.
Вариант 7
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Добавить в конец каждого предложения заданное слово. Слова разделены пробелами и знаками препинания.
Вариант 8
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. В каждом предложении слова переставить в обратном порядке. Слова разделены пробелами и знаками препинания.
Вариант 9
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Заключить во всем тексте заданное слово в кавычки. Слова разделены пробелами и знаками препинания.
Вариант 10
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. В тексте удалить все слова, совпадающие с заданным. Слова разделены пробелами и знаками препинания.
Вариант 11
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. В тексте поменять местами заданные слова. Слова разделены пробелами и знаками препинания.
Вариант 12
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Удалить из текста заданное слово. Слова разделены пробелами и знаками препинания.
Вариант 13
Текст состоит из предложений, разделенных точкой. Текст вводится с клавиатуры, его длина не превышает 1000 символов. Определить порядковый номер заданного слова в каждом предложении. Слова разделены пробелами и знаками препинания.