
- •Глава 8. Строки - объекты класса string
- •8.1. Строковые литералы
- •8.2. Строковые объекты и ссылки типа string
- •8.3. Операции над строками
- •8.4. Некоторые методы и свойства класса String
- •8.5. Форматирование строк
- •8.7. Применение строк в переключателях
- •8.8. Массивы строк
- •8.8. Сравнение строк
- •8.9. Преобразования с участием строкового типа
- •8.10. Аргументы функции Main()
8.8. Сравнение строк
Для объектов класса string определены только две операции сравнения == и != . Если необходимо сравнивать строки по их упорядоченности, например, в лексикографическом порядке, то этих двух операций недостаточно. Кроме уже упомянутого нестатического метода CompareTo() в классе string есть статический метод (точнее набор перегруженных методов) с именем Compare, позволяющий сравнивать строки или их фрагменты. Так как сравнение и сортировка строк очень важны в задачах обработки текстовой информации, то рассмотрим два варианта метода Compare.
Наиболее простой метод имеет следующий заголовок:
int static Compare (string, string)
Сравнивая две строки, использованные в качестве аргументов, метод возвращает значение 0, если строки равны. Если первая строка лексикографически меньше второй - возвращается отрицательное значение. В противном случае возвращаемое значение положительно.
В следующем фрагменте программы определён массив ссылок на строки и из него выбирается и присваивается переменной res ссылка на лексикографически наибольшую строку (08_03.cs):
string[] eng = { "one", "two", "three", "four" };
string res = eng[0];
foreach (string num in eng)
if (string.Compare(res, num) < 0)
res = num;
Console.WriteLine("res = " + res);
Значением строки, связанной со ссылкой-переменной res, будет "two".
Проиллюстрированная форма метода Compare() оценивает лексикографическую упорядоченность, соответствующую английскомуалфавиту. Следующий вариант этого метода позволяет использовать разные алфавиты.
int static Compare (string, string, Boolean, Culturelnfo)
Первые два параметра - сравниваемые строки. Третий параметр указывает на необходимость учитывать регистр символов строк. Если он равен true, то регистры не учитываются и строки "New" и "nEw" будут считаться равными. Четвёртый параметр - объект класса System.Globalization.Culturelnfo - позволяет указать алфавит, который необходимо использовать при лексикографическом сравнении строк. Для построения объекта, который может быть использован в качестве аргумента, заменяющего четвёртый параметр, используют конструктор класса Culturelnfo(string). Аргумент конструктора - строка, содержащая условное обозначение нужного алфавита. Точнее сказать обозначается не алфавит, а культура (Culture), который принадлежит соответствующий язык. Для обозначения национальных культур, приняты имена и коды, таблицу которых можно найти в литературе и документации, (см. например, [13], Приложение 2). Мы в наших примерах будем использовать два алфавита: английский (имя культуры "en", код культуры 0x0009) и русский ("ru" и 0x0019).
В следующем фрагменте программы(08_03.сз), который построен по той же схеме, что и предыдущий, определён массив ссылок на строки с русскими названиями представителей семейства тетеревиных из отряда куриных. Из массива выбирается ссылки на лексикографически наименьшую строку, т.е. расположенную после упорядочения по алфавиту в начале списка.
string[] hens = {"Куропатка белая", "Куропатка тундровая", "Тетерев", "Глухарь", "Рябчик" };
string res = hens[0];
foreach (string hen in hens)
if (string.Compare(res, hen, true, new System.Globalization.CultureInfo("ru")) > 0)
res = hen;
Console.WriteLine(res);
Результат, выводимый на консоль: Глухарь
Обратите внимание, что четвёртый параметр метода Compare() заменён в вызове безымянным объектом класса Culturelnfo, сформированным конструктором класса в выражении с операцией new. Аргумент конструктора - литерная строка "ru" - обозначение нужного алфавита (в данном примере - русского языка). Если возвращаемый результат, больше нуля, то есть первая строка, именуемая ссылкой res, лексикографически больше второй, то вторая строка, связанная со ссылкой hen, принимается в качестве претендента на наименьшее значение.