Г. Шилдт - С#4.0 Полное руководство (1160795), страница 38
Текст из файла (страница 38)
Обратите внимание на то, что некоторые методы принимают параметр типа ягг1пдсощраг1зоп. Это перечислимый тип, определяющий различные значения, которые определяют порядок сравнения символьных строк. (О перечислениях речь пойде~ в главе 12, но для применения типа Яг г1пдсощра г1зоп к символьным строкам знать о перечислениях необязательно.) Нетрудно догадаться, что символьные строки можно сравнивать разными способами. Например, их можно сравнивать на основании двоичных значений символов, из которых они состоят. Такое сравнение называется порядковым.
Строки можно также сравнивать с учетом различных особенносгей культурной среды, например, в лексикографическом порядке. Это так называемое сравненение с учетом культурной среды. (Учитывать культурную среду особенно важно в локализуемых приложениях.) Кроме того, строки можно сравнивать г учетом или без учета регистра. Несмотря на то что существуют перегружаемые варианты методов Сощра ге ( ), Ее)па 1з ( ), 1 ос)ехОГ ( ) и Ьазг1пс)ехОЙ (), обеспечивающие используемый по умолчанию подход к сравнению символьных строк, в настоящее время считается более приемлемым явно указывать способ требуемого сравнения, чтобы избежать неоднозначности, а также упростить локализацию приложений.
Именно поэтому здесь рассматривают разные способы сравнения символьных строк. Как правило и за рядом исключений, для сравнения символьных строк с учетом культурной среды (т.е. языковых и региональных стандартов) применяется способ Ягг1пЯСощраг1зоп. СпггепгСи1гиге. Если же требуется сравнить строки только на основании значений их символов, то лучше воспользоваться способом Ягг1пдСощраг1аоп. Ого)1па1, а для сравнения строк без учета регистра — одним из двух способов: Ягг1пдСощраг1зоп. СпггепгСп1гпге1цпогеСазе или Ягг1пдСощраг1зоп. Огг)1па11дпогеСазе. Кроме того, можно указать сравнение строк без учета культурной среды (подробнее об этом — в главе 22). Обратите внимание на то, что метод Сощра ге () объявляется в табл.
7 1 как згаг1с. Подробнее о модификаторе згагйс речь пойдет в главе 8, а до тех пор вкратце поясним, что он обозначает следующее: метод Сощраге ( ) вызывается по имени своего 200 Часть!. Язык С() класса, а не по его экземпляру. Следовательно, для вызова метода Сотраге () служит следующая общая форма: реэультат = ясг1пс.Саврасе(ясг), яств, способ)г где спосоо обозначает конкретный подход к сравнению символьных строк. ЯРИМЕЧАНИЕ Дополнительные сведения о способах сравнения и поиска символьных строк, включая и особое значение выбора подходящего способа, приведены в главе 22, где подробно рассматривается обработка строк. Таблица 7.1. Некоторые общеупатребительные методы обращения со строками Метод Описание ясагьс Тпс Сотраге (ясг1по ясгА, ясг1пи ясгВ, ВггьпдСотрагдяоп сотрагуяопТуре) Возвращает отрицательное значение, если строка ясгА меньше строки яггВ; положительное значение, если строка яггл больше строки яггВ; и нуль, если сравниваемые строки равны.
Способ сравнения определяется аргументом сотрягвяопТуре Возвращает логическое значение ггие, если вызывающая строка имеет такое же значение, как и у аргумента ча1ие. Способ сравнения определяется арГуМЕНтОМ сотрагуяоптуре Осуществляет поиск в вызывающей строке первого вхождения символа, определяемого аргументом иа1ие.
Применяется порядковый способ поиска. Возвращает индекс первого совпадения с искомым символом или -1, если он не обнаружен Осуществляет поиск в вызывающей строке первого вхождения подстроки, определяемой аргументом иа1ие. Возвращает индекс первого совпадения с искомой подстрокой или -1, если она не обнаружена. Способ поиска определяется аргументом сотрагляопТуре Ьоо1 Вг)иа1я(ясг1по иа1ие, ВсгапдСотраг1яоп сотрагуяопТуре) гпс 1пс)ехог(спас иа1ие) 1пг 1пс)ехОГ (ясг1по иа1ие, Бгг1поСотраг1яоп сотраг1яопТуре) Обратите также внимание на методы То()ррег () и ТоЬонег (), преобразующие содержимое строки в символы верхнего и нижнего регистра соответственно.
Их формы, представленные в табл. 7.1, содержат параметр Си1сиге1п го, относящийся к классу, в котором описываются атрибуты культурной среды, применяемые для сравнения. В примерах, приведенных в этой книге, используются текущие настройки культурной среды (т.е. текущие языковые и региональные стандарты).
Эти настройки указываются при передаче методу аргумента Си1гиге1пГо. СиггепССи1сиге. Класс Си1сиге1пго относится к пространству имен Буясет. С1оЬа11гагьоп, Любопытно, имеются варианты рассматриваемых здесь методов, в которых текущая культурная среда используется по умолчанию, но во избежание неоднозначности в примерах из этой книги аргумент Си1сиге1п То. СиггепгСи1сиге указывается явно. Объекты типа я Г гд по содержат также свойство Ьепосн, где хранится длина строки.
Глава 7. Массивы и строки 201 Окончание табл. 7.1 Описание Тпи Ьаяъ1пбехОЙ(с)тат иа1ие) Осуществляет поиск в вызывающей строке последнего вхождения символа, определяемого аргументом иа1ие. Применяется порядковый способ поиска. Возвращает индекс последнего совпадения с искомым символом или -1, если он не обнаружен Осуществляет поиск в вызывающей строке последнего вхождения подстроки, определяемой аргументом иа1ие. Возвращает индекс последнего совпадения с искомой подстрокой или -1, если она не обнаружена. Способ пойска определяется аргументом сптрагбяоптуре Возвращает вариант вызывающей строки в нижнем регистре. Способ преобразования определяется аргументом си1 гите Возвращает вариант вызывающей строки в верхнем регистре.
Способ преобразования определяется ар- ГУМЕНтОМ си1еисе гпг Ьаяг1пс(ехОТ(ягг1пд иа1ие, Ясг1поСотраг1яоп соярасуяоптуре) ягг1по ТоЬоыег(Си1гиге1пго. СиггепЬСи1гиге си1гиге) ягг1пЧ Тоцррег(Си1сиге1пбо. СиггепССи1ииге си1гиге) Отдельный символ выбирается из строки с помощью индекса, как в приведенном ниже фрагменте кода. ясг1по ясг = "тест"; Сопяо1е.нг1сеьтпе(ягг(0]) Некоторые операции со строками.
ияьпс Яуясели ияхпд Яуясеи.О1опа1гяагхопг В этом фрагменте кода выводится символ "т", который является первым в строке "тест". Как и в массивах, индексирование строк начинается с нуля. Следует, однако, иметь в виду, что с помощью индекса нельзя присвоить новое значение символу в строке.
Индекс может служить только для выборки символа из строки. Для проверки двух строк на равенство служит оператор ==. Как правило, если оператор == применяется к ссылкам на объект, то он определяет, являются ли они ссылками на один и тот же объект. Совсем иначе обстоит дело с объектами типа я с гйпо.
Когда оператор == применяется к ссылкам на две строки, он сравнивает содержимое этих строк. Это же относится и к оператору ! =. В обоих случаях выполняется порядковое сравнение. Для проверки двух строк на равенство с учетом культурной среды служит метод Ес(иа1я (), где непременно нужно указать способ сравнения в виде аргумента ЯггзпоСонрагзяоп. СиггепССи1гиге. Следует также иметь в виду, что метод Соглраге () служит для сравнения строк с целью определить отношение порядка, например для сортировки. Если же требуется проверить символьные строки на равенство, то для этой цели лучше воспользоваться методом Ес(иа1я () или строковыми операторами.
В приведенном ниже примере программы демонстрируется несколько операций со строками. 202 Часть!. Язык С№ с1азя Бягбрз ( ягагьс уо1с) Маьп() ( яяг1пс яяг1 = "Програымировать в .ИЕТ лучше всего на С()." яггтпс ягг2 = "программировать в .иет лучше всего на С()." згг1пс ясгЗ = "Строки в С() весьма эффективны.") ясгзп9 ясгбр, яягьон) Тпг геяо1г, збх; Сопзо1е.шг1яе11пе("зяг1: " + зяг1); Сопяо1е.шггсеььпе("Длина строки ясг1: " + зпг1.ьепцСЬ)т Создать варианты строки ясг1, набранные // прописными и строчными буквами.
зггьон = ясг1.тоьонег(сы1соге1псо.спггепгсп1гпге)т ясгбр = ясг1.Тобррег(Сп1спге1псо.СпггепССи1япге); Сопяо1е.нгьсеььпе("Вариант строки ясг1, "набранный строчными буквами:1п Сопяо1е.кг1яе11пе("Вариант строки яяг1, "набранный праписныыи буквами: 1п яггьон) т яггср)т Сопяо1е.нг1сеьзпе() // Вывести строку ясг1 посимвольно. Сопяо1е.шг1Геь1пе("Вывод строки ясг1 посимвольно.") Тот(1пг 1=0) 1 < яяг1.Ьепссь) 1++) Сопяо1е.шгзсе(ясг1[1)); Сопяо1е.нг1се11пе ("1п") ) // Сравнить строки способом порядкового сравнения. 1Т(ясг1 == ясг2) Сопяо1е.нгьяетзпе("яяг1 = яяг2")т е1яе Сопзо1е.ыг1теьзпе("яяг1 1= яяг2")т 11(зсг1 == ясгЗ) Сопяо1е.шгзсе11пе("ягг1 == ясгз") т е1ве Сопяо1е.шггсеЬзпе("ясг1 )= япгЗ")) // Сравнить строки с учетом культурной среды. геви1Г = ясгзпд.Сошраге(зсгЗ, ясг1, ясггпцСошрагьяоп.Сп Ы(геяп1г == 0) Сопяо1е.шгзсеььпе (" Строки ясг1 и ясгз равны"); е1яе 11(геяп1С < 0) Сопяо1е.шгзгеььпе("Строка яог1-меньше строки ясгЗ")т е1яе Сопзо1е.Иг1яетьпе("Строка зяг1 больше строки ясгЗ")) ггепГСч1Гоге) Сопяо1е.нгзсеьзпе() // Присвоить новую строку переменной ясг2.
зог2 = "Один Два Три Один"; // Поиск подстроки. Тбх = яяг2 . 1п<)ехОГ (" Один", ЗяггпдСошраггяоп.бгбьпа1) ) сопяо1е.игьсееьпе("индекс первого вхождения подстроки <Один>: " + Тбх)) Глава т. Массивы и строки 203 1бх = всг2.1аас1пг)ехос("Один", ясггпссовраггаоп.огг)1па1); сопао1е.хгггеьтпе("индекс последнего вхождения подстроки <Один>: 1с)х); ) При выполнении этой программы получается следующий результат.
агг1: Программировать в .НЕТ лучше всего на С4. Длина строки асг1: 41 Вариант строки всг1, набранный строчными буквами: программировать в .пег лучше всего на сс. Вариант строки асг1, набранный прописными буквами: программировать в .пес лучше всего на с4. ВыВОд стрОкн асг1 пОснмВОльнО. Программировать в .НЕТ лучше всего на С4.
асг1 == асг2 асг1 != асгз Строка асг1 больше строки асгз Индекс первого вхождения подстроки <Один>: 0 Индекс последнего вхождения подстроки <Один>: 13 Прежде чем читать дальше, обратите внимание на то, что метод Совраге () вызывается следующим образом. геап1Г = всг1по.совраге(асг1, всгз, Ясг1пчсовраг1аоп.сиггепгсп1спге); Как пояснялось ранее, метод Совраге () объявляется как всас1С, и поэтому он вызывается по имени, а не по экземпляру своего класса.
С помощью оператора + можно сцепить (т.е, объединить вместе) две строки. Например, в следующем фрагменте кода: асг1пч асг1 = "Один"~ агггпп агг2 = "Два"; вгггпо аггз = "Три"; ясг1пя асг4 = асг1 + асг2 + асгз; переменная вгг4 инициализируется строкой "ОдинДватри П И еще одно замечание: ключевое слово всг1по является псевдонимом класса Вувбев.
Вгг1по, определенного в библиотеке классов для среды .)ь)ЕТ Егатеьуог)с т.е. оно устанавливает прямое соответствие с этим классом. Следовательно, поля и методы, определяемые типом всг1по, относятся непосредственно к классу Вуагев. Бгг1по, в который входят и многие другие компоненты. Подробнее о классе Яув сев. Бсг1по речь пойдет в части Б этой книги. Массивы строк Аналогично данным любого другого типа, строки могут быть организованы в массивы. Ниже приведен соответствующий пример.
2/ Продемонстрировать массивы строк. нагло Бувгев; 204 Часть]. Язык С() с1аяя БггапдАггауя ( ятат1с чоао Иа1п () ( яггтпч[] ягг = ( "Это", "очень", "простой", "тест." ); Сопво1е.нг1гевупе("Исходный массив: "); Вот(1пт г=с; г < ятг.ьепчтп; 1+ь) Сопяо1е.Итаке(ятг[1] ь " "); Сопяо1е.нг1теЬ1пе("1п"); // Изменить строку, втт[1] = "тоже"; ятг[З] = "до предела тест! Сопао1е.нггтеЬгпе("Видоизмененный массив: тот ( 1пг 1=0; 1 < ягт . Ьепдггм 1++) сопяо1е.игтге(ягт[г] ь " "); Вот какой результат дает выполнение приведенного выше кода.