Сравнение строк
Из всех операций обработки строк, возможно, чаще всего используется операция сравнения одной строки с другой. Самый универсальный из них — метод Compare(). Он может сравнивать две строки целиком или по частям, причем с учетом (или без) прописного или строчного варианта букв (т.е. регистра клавиатуры). В общем случае при сравнении строк, т.е. при определении того, больше ли одна строка другой, меньше или они равны, используется лексикографический порядок. При этом можно также задать специальную информацию (форматы данных, присущие естественному языку, диалекту или территориальному образованию), которая может повлиять на результат сравнения.
Использование нескольких версий метода Compare() демонстрируется в следующей программе:
private void Form1_Load(object sender, EventArgs e)
{
string str1 = "один";
string str2 = "один";
string str3 = "ОДИН";
string str4 = "два";
string str5 = "один, два";
if (String.Compare(str1, str2) == 0)
label1.Text = (str1 + " и " + str2 + " равны.");
else
label1.Text = (str1 + " и " + str2 + " не равны.");
if (String.Compare(str1, str3) == 0)
label2.Text = (str1 + " и " + str3 + " равны.");
else
label2.Text = (str1 + " и " + str3 + " не равны.");
if (String.Compare(str1, str3, true) == 0)
label3.Text = (str1 + " и " + str3 +
" равны без учета регистра.");
else
label3.Text = (str1 + " и " + str3 +
" не равны без учета регистра.");
if (String.Compare(str1, str5) == 0)
label4.Text = (str1 + " и " + str5 + " равны.");
else
label4.Text = (str1 + " и " + str5 + " не равны.");
if (String.Compare(str1, 0, str5, 0, 3) == 0)
label5.Text = ("Первая часть строки " + str1 + " и " +
str5 + " равны.");
else
label5.Text = ("Первая часть строки " + str1 + " и " +
str5 + " не равны.");
int result = String.Compare(str1, str4);
if (result < 0)
label6.Text = (str1 + " меньше " + str4);
else if (result > 0)
label6.Text = (str1 + " больше " + str4);
else
label6.Text = (str1 + " равно " + str4);
}
Объединение строк
Существует два способа конкатенации (объединения) двух или больше строк. Можно использовать для этого оператор “+”. Также можно применить один из методов конкатенации, определенных в классе String. Несмотря на то что оператор “+” — самое простое решение во многих случаях, методы конкатенации предоставляют дополнительные возможности.
Метод, который выполняет конкатенацию, именуется Concat(), а его простейший формат таков:
public static string Concat(string str1, string str2)
Метод возвращает строку, которая содержит строку str2, присоединенную к концу строки str1.
Еще один формат метода Concat() позволяет объединить три строки:
public static string Concat( string str1, string str2, string str3)
При вызове этой версии возвращается строка, которая содержит конкатенированные строки str1, str2 и str3. По правде говоря, для выполнения описанных выше операций все же проще использовать оператор “+”, а не метод Concat().
А вот следующая версия метода Concat() объединяет произвольное число строк, что делает ее весьма полезной для программиста:
public static string Concat(params string[] strs)
Здесь метод Concat() принимает переменное число аргументов и возвращает результат их конкатенации. Пример использования:
private void Form1_Load(object sender, EventArgs e)
{
string result = String.Concat(
"Мы ", "тестируем ",
"один ", "из ", "методов ",
"конкатенации ", "класса ",
"String.");
label1.Text = ("Результат: " + result);
}
Некоторые версии метода Concat() принимают не string-, a object-ссылки. Они извлекают строковое представление из передаваемых им объектов и возвращают строку, содержащую конкатенированные строки. Форматы этих версий метода Concat() таковы:
public static string Concat(object v1, object v2)
public static string Concat( object v1,object v2,object v3)
public static string Concat(params object[] v)
Первая версия возвращает строку, которая содержит строковое представление объекта v2, присоединенное к концу строкового представления объекта v1. Вторая возвращает строку, которая содержит конкатенированные строковые представления объектов v1, v2 и v3. Третья возвращает строку, содержащую конкатенированные строковые представления аргументов, переданных в виде “сборного” объекта v. Чтобы вы могли оценить потенциальную пользу этих методов, рассмотрим следующую программу:
private void Form1_Load(object sender, EventArgs e)
{
string result = String.Concat("Привет ", 10, " ",
20.0, " ",
false, " ",
23.45M);
label1.Text = ("Результат: " + result);
}
В этом примере метод Concat() конкатенирует строковые представления различных типов данных. Для получения строкового представления каждого аргумента здесь вызывается метод ToString(), связанный с соответствующим аргументом. Так, для значения 10 вызывается метод Int32.ToString(). Методу Concat() остается лишь объединить эти строки и возвратить результат. Этот формат метода Concat() очень удобен, поскольку позволяет программисту не получать вручную строковые представления до самой конкатенации.
Разбиение и сборка строк
Двумя важными операциями обработки строк являются разбиение (декомпозиция) и сборка. При разбиении строка делится на составные части. А при сборке строка “собирается” из отдельных частей. Для разбиения строк в классе string определен метод Split(), а для сборки — метод Join().
Форматы использования метода Split() таковы:
public string[] split(params char[] seps)
public string[] split(params char[] seps, int count)
Метод первого формата предназначен для разбиения вызывающей строки на подстроки, которые возвращаются методом в виде строкового массива. Символы, которые отделяют подстроки одну от другой, передаются в массиве seps. Если параметр seps содержит null-значение, в качестве разделителя подстрок используется пробел. Метод второго формата отличается от первого тем, что ограничивает количество возвращаемых подстрок значением count.
Рассмотрим теперь форматы применения метода Join():
public static string Join(string sep, string[] strs)
public static string Join(string sep, string[] strs, int start, int count)
Метод Join() в первом формате возвращает строку, которая содержит конкатенированные строки, переданные в массиве strs. Второй формат позволяет собрать строку, которая будет содержать count конкатенированных строк, переданных в массиве strs, начиная со строки strs[start]. В обоих случаях каждая строка, составляющая результат, отделяется от следующей разделительной строкой, заданной параметром sep.
Использование методов Split() и Join() демонстрируется в следующей программе:
private void Form1_Load(object sender, EventArgs e)
{
string str =
"Какое слово ты скажешь, такое в ответ и услышишь.";
char[] seps = { ' ', '.', ',', };
// Разбиваем строку на части.
string[] parts = str.Split(seps);
textBox1.Text = (
"Результат разбиения строки на части: ");
for (int i = 0; i < parts.Length; i++)
textBox1.AppendText(Environment.NewLine + parts[i]);
// Теперь собираем эти части в одну строку.
string whole = String.Join(" | ", parts);
textBox1.AppendText(Environment.NewLine + "Результат сборки: ");
textBox1.AppendText(Environment.NewLine + whole);
}
Декомпозиция строки — важная операция обработки строк, поскольку ее часто используют для получения отдельных лексем, составляющих строку.
Удаление символов и дополнение ими строк
Иногда возникает необходимость удалить из строки начальные и концевые пробелы. Без этой операции, как правило, не обходится ни один командный процессор. Например, программа ведения базы данных способна распознать слово “print”. Но пользователь мог ввести эту команду с одним или несколькими начальными либо концевыми пробелами. Поэтому, прежде чем такая команда будет передана на распознание базой данных, из нее должны быть удалены “лишние” пробелы. И наоборот, возможны ситуации, когда строку нужно дополнить пробелами, чтобы она “доросла” до определенной минимальной длины. Например, при подготовке данных для форматированного вывода необходимо позаботиться о том, чтобы каждая выводимая строка имела определенную длину. К. счастью, в C# предусмотрены методы, которые позволяют легко выполнить эти операции.
Чтобы удалить из строки начальные и концевые пробелы, используйте один из следующих вариантов метода Trim():
public string Trim()
public string Trim(params char[] chrs)
Первый формат метода предназначен для удаления начальных и концевых пробелов из вызывающей строки. Второй позволяет удалить начальные и концевые символы, заданные параметром chrs. В обоих случаях возвращается строка, содержащая результат этой операции.
В C# предусмотрена возможность дополнить строку заданными символами справа либо слева. Для реализации “левостороннего” дополнения строки используйте один из следующих методов:
public string PadLeft(int len)
public string PadLeft(int len, char ch)
Первый формат метода предназначен для дополнения строки с левой стороны пробелами в таком количестве, чтобы общая длина вызывающей строки стала равной заданному значению len. Второй формат отличается от первого тем, что для дополнения строки вместо пробела используется символ, заданный параметром ch. В обоих случаях возвращается строка, содержащая результат этой операции.
Для реализации “правостороннего” дополнения строки используйте один из следующих методов:
public string PadRight(int len)
public string PadRight(int len, char ch)
Первый формат метода дополняет строку с правой стороны пробелами в таком количестве, чтобы общая длина вызывающей строки стала равной заданному значению len. Второй формат отличается от первого тем, что для дополнения строки вместо пробела используется символ, заданный параметром ch. В обоих случаях возвращается строка, содержащая результат этой операции.
Выполнение операций удаления символов и дополнения ими строк демонстрируется в следующей программе:
private void Form1_Load(object sender, EventArgs e)
{
string str = "тест";
textBox1.AppendText( "Исходная строка: " + str);
// Дополнение пробелами с левой стороны строки.
str = str.PadLeft(10);
textBox1.AppendText(Environment.NewLine + "|" + str + "|");
// Дополнение пробелами с правой стороны строки.
str = str.PadRight(20);
textBox1.AppendText(Environment.NewLine + "|" + str + "|");
// Удаление начальных и концевых пробелов.
str = str.Trim();
textBox1.AppendText(Environment.NewLine + "|" + str + "|");
// "Левостороннее" дополнение строки символами "#".
str = str.PadLeft(10, '#');
textBox1.AppendText(Environment.NewLine + "|" + str + "|");
// "Правостороннее" дополнение строки символами "#".
str = str.PadRight(20, '#');
textBox1.AppendText(Environment.NewLine + "|" + str + "|");
// Удаление начальных и концевых символов "#".
str = str.Trim('#');
textBox1.AppendText(Environment.NewLine + "|" + str + "|");
}
Вставка, удаление и замена
С помощью метода Insert() можно вставлять одну строку в другую:
public string Insert(int start, string str)
Здесь параметром str задается строка, вставляемая в вызывающую. Позиция вставки (индекс) задается параметром start. Метод возвращает строку, содержащую результат этой операции.
С помощью метода Remove() можно удалить заданную часть строки:
public string Remove(int start, int count)
Количество удаляемых символов задается параметром count. Позиция (индекс), с которой начинается удаление, задается параметром start. Метод возвращает строку, содержащую результат этой операции.
С помощью метода Replace() можно заменить часть строки заданным символом либо строкой. Этот метод используется в двух форматах:
public string Replace(char ch1, char ch2)
public string Replace(string str1, string str2)
Первый формат метода позволяет заменить в вызывающей строке все вхождения символа ch1 символом ch2. Второй служит для замены в вызывающей строке всех вхождений строки str1 строкой str2. В обоих случаях возвращается строка, содержащая результат этой операции.
Рассмотрим программу, в которой демонстрируется использование методов Insert(), Remove() и Replace():
private void Form1_Load(object sender, EventArgs e)
{
string str = "Это тест";
textBox1.AppendText("Исходная строка: " + str);
// Вставляем строку.
str = str.Insert(4, "простой ");
textBox1.AppendText(Environment.NewLine + str );
// Заменяем строку.
str = str.Replace("простой", "сложный");
textBox1.AppendText(Environment.NewLine + str);
// Заменяем символы.
str = str.Replace('т', 'X');
textBox1.AppendText(Environment.NewLine + str);
// Удаляем подстроку.
str = str.Remove(4, 5);
textBox1.AppendText(Environment.NewLine + str);
}
Изменение Регистра
Класс String содержит два удобных метода, которые позволяют изменить “регистр”, т.е. способ написания букв в строке. Эти методы называются ToUpper() и ToLower():
public string ToLower()
public string ToUpper()
Метод ToLower() заменяет все буквы в вызывающей строке их строчными вариантами, а метод ToUpper() — прописными. Оба метода возвращают строку, содержащую результат операции. Существуют также версии этих методов, которые позволяют задавать форматы данных, присущие конкретному естественному языку, диалекту или территориальному образованию.
Использование метода Substring()
С помощью метода Substring() можно получить нужную часть строки.
Возможны две формы использования этого метода:
public string Substring(int idx)
public string Substring(int idx, int count)
При использовании первой формы выделяемая подстрока начинается с элемента, заданного индексом idx, и продолжается до конца вызывающей строки. Вторая форма позволяет выделить подстроку, которая начинается с элемента, заданного индексом idx, и включает count символов. В обоих случаях возвращается выделенная подстрока.
Использование метода Substring() демонстрируется в следующей программе:
private void Form1_Load(object sender, EventArgs e)
{
string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
textBox1.AppendText("str: " + str);
textBox1.AppendText(Environment.NewLine + "str.Substring(15): ");
string substr = str.Substring(15);
textBox1.AppendText(substr);
textBox1.AppendText(Environment.NewLine + "str.Substring(0, 15): ");
substr = str.Substring(0, 15);
textBox1.AppendText(substr);
}
Форматирование
Если данные встроенного типа (например, int или double) требуется представить в форме, удобной для восприятия человеком, необходимо создать их строковое представление. Несмотря на то что C# автоматически поддерживает стандартный формат для такого представления, у программиста есть возможность задать собственный формат. Например, как было показано в части I, числовые данные можно вывести в формате с указанием суммы в долларах и центах. Для числовых типов предусмотрен ряд методов форматирования данных, в том числе и методы Console.WriteLine(), String.Format() и ToString(). Во всех этих трех методах используется один и тот же подход к форматированию, поэтому, научившись форматировать данные с помощью одного их них, вы сможете применить свои навыки и к остальным методам.
Использование метода Substring() для форматирования данных
Для получения форматированного нужным образом строкового представления, соответствующего значению встроенного числового типа (например, Int32 или Double), можно использовать метод ToString():
public string ToString(string fmt)
Метод ToString() возвращает строковое представление вызывающего объекта в соответствии с заданным спецификатором формата, переданным в параметре fmt. Например, следующая программа создает денежное представление значения 188.99, используя спецификатор формата C:
string str = 189.99.ToString("C");
Обратите внимание на то, что спецификатор формата непосредственно передается методу ToString(). В отличие от методов WriteLine() или Format(), которые используют встроенные команды форматирования (вместе с номером аргумента и значением ширины поля), метод ToString() принимает только спецификатор формата.
private void Form1_Load(object sender, EventArgs e)
{
// Использование метода ToString() для
// форматирования значений.
double v = 17688.65849;
double v2 = 0.15;
int x = 21;
string str = v.ToString("F2");
textBox1.AppendText(Environment.NewLine + str);
str = v.ToString("N5");
textBox1.AppendText(Environment.NewLine + str);
str = v.ToString("e");
textBox1.AppendText(Environment.NewLine + str);
str = v.ToString("r");
textBox1.AppendText(Environment.NewLine + str);
str = v2.ToString("p");
textBox1.AppendText(Environment.NewLine + str);
str = x.ToString("X");
textBox1.AppendText(Environment.NewLine + str);
str = x.ToString("D12");
textBox1.AppendText(Environment.NewLine + str);
str = 189.99.ToString("C");
textBox1.AppendText(Environment.NewLine + str);
}
На этом всё.