Справочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией
Скачать 5.05 Mb.
|
Конкатенация строк Существует два способа конкатенации (объединения) двух или больше строк. Во- первых, как показано в главе 7, можно использовать для этого оператор “ + ”. Во-вторых, можно применить один из методов конкатенации, определенных в классе 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 ) 548 Часть II. Библиотека C# Здесь метод Concat() принимает переменное число аргументов и возвращает результат их конкатенации. Использование этой версии метода Concat() демонстрируется в следующей программе: // Демонстрация использования метода Concat(). using System; class ConcatDemo { public static void Main() { string result = String.Concat( "Мы ", "тестируем ", "один ", "из ", "методов ", "конкатенации ", "класса ", "String."); Console.WriteLine("Результат: " + result); } } Результаты выполнения этой программы таковы: Результат: Мы тестируем один из методов конкатенации класса String. Некоторые версии метода 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 . Чтобы вы могли оценить потенциальную пользу этих методов, рассмотрим следующую программу: // Еще один способ использования метода Concat(). using System; class ConcatDemo { public static void Main() { string result = String.Concat("Привет ", 10, " ", 20.0, " ", false, " ", 23.45M); Console.WriteLine("Результат: " + result); } } Глава 20. Строки и форматирование 549 Результаты выполнения этой программы таковы: Результат: Привет 10 20 False 23.45 В этом примере метод Concat() конкатенирует строковые представления различных типов данных. Для получения строкового представления каждого аргумента здесь вызывается метод ToString() , связанный с соответствующим аргументом. Так, для значения 10 вызывается метод Int32.ToString() . Методу Concat() остается лишь объединить эти строки и возвратить результат. Этот формат метода Concat() очень удобен, поскольку позволяет программисту не получать вручную строковые представления до самой конкатенации. Поиск строки В классе String есть два набора методов, которые позволяют найти заданную строку (подстроку либо отдельный символ). При этом можно заказать поиск первого либо последнего вхождения искомого элемента. Чтобы отыскать первое вхождение символа или подстроки, используйте метод IndexOf() , который имеет два таких формата: public int IndexOf(char ch ) public int IndexOf(string str ) Метод IndexOf() , используемый в первом формате, возвращает индекс первого вхождения символа ch в вызывающей строке. Второй формат позволяет найти первое вхождение строки str . В обоих случаях возвращается значение — 1, если искомый элемент не найден. Чтобы отыскать последнее вхождение символа или подстроки, используйте метод LasItndexOf() , который имеет два таких формата: public int LastIndexOf(char ch ) public int LastIndexOf(string str ) Метод LastIndexOf() , используемый в первом формате, возвращает индекс последнего вхождения символа ch в вызывающей строке. Второй формат позволяет найти последнее вхождение строки str . В обоих случаях возвращается значение — 1, если искомый элемент не найден. В классе String определено два дополнительных метода поиска: IndexOfAny() и LastIndexOfAny() . Они выполняют поиск первого или последнего символа, который совпадает с любым элементом заданного набора символов. Вот их форматы: public int IndexOfAny(char[] a ) public int LastIndexOfAny(char[] a ) Метод IndexOfAny() возвращает индекс первого вхождения любого символа из массива а , который обнаружится в вызывающей строке. Метод LastIndexOfAny() возвращает индекс последнего вхождения любого символа из массива а , который обнаружится в вызывающей строке. В обоих случаях возвращается значение — 1, если совпадение не обнаружится. При работе со строками часто возникает необходимость узнать, начинается ли строка с заданной подстроки либо оканчивается ею. Для таких ситуаций используются методы StartsWith() и EndsWith() : public bool StartsWith(string str ) public bool EndsWith(string str ) Метод StartsWith() возвращает значение true , если вызывающая строка начинается с подстроки, переданной в параметре str . Метод EndsWith() возвращает значение true , если вызывающая строка оканчивается подстрокой, переданной в параметре str . В случае неудачного исхода оба метода возвращают значение false 550 Часть II. Библиотека C# Использование методов поиска строк демонстрируется в следующей программе: // Поиск строк. using System; class StringSearchDemo { public static void Main() { string str = "C# обладает мощными средствами обработки строк."; int idx; Console.WriteLine("str: " + str); idx = str.IndexOf('с'); Console.WriteLine( "Индекс первого вхождения буквы 'с': " + idx); idx = str.LastIndexOf('с'); Console.WriteLine( "Индекс последнего вхождения буквы 'с': " + idx); idx = str.IndexOf("ми"); Console.WriteLine( "Индекс первого вхождения подстроки \"ми\": " + idx); idx = str.LastIndexOf("ми"); Console.WriteLine( "Индекс последнего вхождения подстроки \"ми\": " + idx); char[] chrs = { 'а', 'б', 'в' }; idx = str.IndexOfAny(chrs); Console.WriteLine( "Индекс первой из букв 'а', 'б' или 'в': " + idx); if(str.StartsWith("C# обладает")) Console.WriteLine( "str начинается с подстроки \"C# обладает\""); if(str.EndsWith("строк.")) Console.WriteLine( "str оканчивается подстрокой \"строк.\""); } } Результаты выполнения этой программы таковы: str: C# обладает мощными средствами обработки строк. Индекс первого вхождения буквы 'с': 20 Индекс последнего вхождения буквы 'с': 41 Индекс первого вхождения подстроки "ми": 17 Индекс последнего вхождения подстроки "ми": 28 Индекс первой из букв 'а', 'б' или 'в': 4 str начинается с подстроки "C# обладает" str оканчивается подстрокой "строк." Некоторые методы поиска имеют дополнительные форматы, которые позволяют начать поиск с заданного индекса или указать диапазон поиска. Все версии методов Глава 20. Строки и форматирование 551 поиска символов в строке, которые определены в классе String , приведены в табл. 20.2. Таблица 20.2. Методы поиска символов в строке, определенные в классе String Метод Описание public bool EndsWith( string str ) Возвращает значение true , если вызывающая строка оканчивается подстрокой, переданной в параметре str . В противном случае метод возвращает значение false public int IndexOf( char ch ) Возвращает индекс первого вхождения символа ch в вызывающей строке. Возвращает значение -1, если искомый символ не обнаружен public int IndexOf( string str ) Возвращает индекс первого вхождения подстроки str в вызывающей строке. Возвращает значение -1, если искомая подстрока не обнаружена public int IndexOf( char ch , int start ) Возвращает индекс первого вхождения символа ch в вызывающей строке. Поиск начинается с элемента, индекс которого задан параметром start . Возвращает значение -1, если искомый символ не обнаружен public int IndexOf( string str , int start ) Возвращает индекс первого вхождения подстроки str в вызывающей строке. Поиск начинается с элемента, индекс которого задан параметром start . Возвращает значение -1, если искомая подстрока не обнаружена public int IndexOf( char ch , int start , int count ) Возвращает индекс первого вхождения символа ch в вызывающей строке. Поиск начинается с элемента, индекс которого задан параметром start , и охватывает count элементов. Метод возвращает значение -1, если искомый символ не обнаружен public int IndexOf( string str , int start , int count ) Возвращает индекс первого вхождения подстроки str в вызывающей строке. Поиск начинается с элемента, индекс которого задан параметром start , и охватывает count элементов. Метод возвращает значение -1, если искомая подстрока не обнаружена public int IndexOfAny( char[] a ) Возвращает индекс первого вхождения любого символа из последовательности а, который будет обнаружен в вызывающей строке. Возвращает значение -1, если совпадения символов не обнаружено public int IndexOfAny( char[] a , int start ) Возвращает индекс первого вхождения любого символа из последовательности а , который будет обнаружен в вызывающей строке. Поиск начинается с элемента, индекс которого задан параметром start . Метод возвращает значение -1, если совпадения символов не обнаружено public int IndexOfAny( char[] a , int start , int count ) Возвращает индекс первого вхождения любого символа из последовательности а , который будет обнаружен в вызывающей строке. Поиск начинается с элемента, индекс которого задан параметром start , и охватывает count элементов. Метод возвращает значение -1, если совпадения символов не обнаружено public int LastIndexOf( char ch ) Возвращает индекс последнего вхождения символа ch в вызывающей строке. Возвращает значение -1, если искомый символ не обнаружен public int LastIndexOf( string str ) Возвращает индекс последнего вхождения подстроки str в вызывающей строке. Возвращает значение -1, если искомая подстрока не обнаружена public int LastIndexOf( char ch , int start ) Возвращает индекс последнего вхождения символа ch , обнаруженного в пределах диапазона вызывающей строки. Поиск выполняется в обратном порядке, начиная с элемента, индекс которого задан параметром start , и заканчивая элементом с нулевым индексом. Метод возвращает значение -1, если искомый символ не обнаружен 552 Часть II. Библиотека C# Окончание табл. 20.2 Метод Описание public int LastIndexOf( string str , int start ) Возвращает индекс последнего вхождения подстроки str , обнаруженной в пределах диапазона вызывающей строки. Поиск выполняется в обратном порядке, начиная с элемента, индекс которого задан параметром start , и заканчивая элементом с нулевым индексом. Метод возвращает значение -1, если искомая подстрока не обнаружена public int LastIndexOf( char ch , int start , int count ) Возвращает индекс последнего вхождения символа ch , обнаруженного в пределах диапазона вызывающей строки. Поиск выполняется в обратном порядке, начиная с элемента, индекс которого задан параметром start , и охватывая count элементов. Метод возвращает значение -1, если искомый символ не обнаружен public int LastIndexOf( string str , int start , int count ) Возвращает индекс последнего вхождения подстроки str , обнаруженной в пределах диапазона вызывающей строки. Поиск выполняется в обратном порядке, начиная с элемента, индекс которого задан параметром start , и охватывая count элементов. Метод возвращает значение -1, если искомая подстрока не обнаружена public int LastIndexOfAny( char[] a ) Возвращает индекс последнего вхождения любого символа из последовательности а , который будет обнаружен в вызывающей строке. Возвращает значение -1, если совпадения символов не обнаружено public int LastIndexOfAny( char[] a , int start ) Возвращает индекс последнего вхождения любого символа из последовательности а , который будет обнаружен в вызывающей строке. Поиск выполняется в обратном порядке, начиная с элемента, индекс которого задан параметром start , и заканчивая элементом с нулевым индексом. Возвращает значение -1, если совпадения символов не обнаружено public int LastIndexOfAny( char[] a , int start , int count ) Возвращает индекс последнего вхождения любого символа из последовательности а , который будет обнаружен в вызывающей строке. Поиск выполняется в обратном порядке, начиная с элемента, индекс которого задан параметром start , и охватывая count элементов. Возвращает значение -1, если совпадения символов не обнаружено public bool StartsWith( string str ) Возвращает значение true , если вызывающая строка начинается строкой, переданной в параметре str . В противном случае метод возвращает значение false Разбиение и сборка строк Двумя важными операциями обработки строк являются разбиение (декомпозиция) и сборка. При разбиении строка делится на составные части. А при сборке строка “собирается” из отдельных частей. Для разбиения строк в классе string определен метод Split() , а для сборки — метод Join() Форматы использования метода Split() таковы: public string[] split(params char[] seps ) public string[] split(params char[] seps , int count ) Метод первого формата предназначен для разбиения вызывающей строки на подстроки, которые возвращаются методом в виде строкового массива. Символы, которые отделяют подстроки одну от другой, передаются в массиве seps . Если параметр seps содержит null -значение, в качестве разделителя подстрок используется пробел. Метод второго формата отличается от первого тем, что ограничивает количество возвращаемых подстрок значением count . Рассмотрим теперь форматы применения метода Join() : Глава 20. Строки и форматирование 553 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() демонстрируется в следующей программе: // Демонстрация разбиения и сборки строк. using System; class SplitAndJoinDemo { public static void Main() { string str = "Какое слово ты скажешь, такое в ответ и услышишь."; char[] seps = {' ', '.', ',',}; // Разбиваем строку на части. string[] parts = str.Split(seps); Console.WriteLine( "Результат разбиения строки на части: "); for(int i=0; i < parts.Length; i++) Console.WriteLine(parts[i]); // Теперь собираем эти части в одну строку. string whole = String.Join(" | ", parts); Console.WriteLine("Результат сборки: "); Console.WriteLine(whole); } } Вот какой результат получен: Результат разбиения строки на части: Какое слово ты скажешь такое в ответ и услышишь Результат сборки: Какое | слово | ты | скажешь | | такое | в | ответ | и | услышишь | Декомпозиция строки — важная операция обработки строк, поскольку ее часто используют для получения отдельных лексем, составляющих строку. Программа ведения базы данных, например, может использовать метод Split() для разложения такого запроса, как “отобразить все балансы, превышающие значение 100” на отдельные составляющие (например, “отобразить” и “100”). В этом процессе разделители |