Полное руководство. С# 4.0 - Шилдт Герберт
Тип StringComparison представляет собой перечисление, в котором определяютсязначения, приведенные в табл. 22.2. Используя эти значения, можно организовать сравнение строк, удовлетворяющее потребностям конкретного приложения. Следовательно, добавление параметра типа StringComparison расширяет возможности методаCompare() и других методов сравнения, например, Equals(). Это дает также возможность однозначно указывать способ предполагаемого сравнения строк. В силу имеющихотличий между сравнением строк с учетом культурной среды и порядковым сравнением очень важно быть предельно точным в этом отношении. Именно по этой причинев примерах программ, приведенных в данной книге, параметр типа StringComparisonявно указывается в вызовах тех методов, в которых он поддерживается.
Таблица 22.2. Значения, определяемые в перечислении StringComparisonЗначениеОписаниеCurrentCultureСравнение строк производится с использованием текущих настроек параметров культурной средыCurrentCultureIgnoreCaseСравнение строк производится с использованием текущих настроек параметров культурной среды, но без учета регистраInvariantCultureСравнение строк производится с использованием неизменяемых, т.е. универсальных данных о культурной средеInvariantCultureIngoreCaseСравнение строк производится с использованием неизменяемых, т.е. универсальных данных о культурной среде и без учета регистраOrdinalСравнение строк производится с использованием порядковых значений символов в строке. При этом лексикографический порядок может нарушиться, а условные обозначения, принятые в отдельной культурной среде, игнорируютсяOrdinalIgnoreCaseСравнение строк производится с использованием порядковых значений символов в строке, но без учета регистра. При этом лексикографический порядок может нарушиться, а условные обозначения, принятые в отдельной культурной среде, игнорируются
В любом случае метод Compare() возвращает отрицательное значение, если перваясравниваемая строка оказывается меньше второй; положительное значение, если первая сравниваемая строка больше второй; и наконец, нуль, если обе сравниваемые строки равны. Несмотря на то что метод Compare() возвращает нуль, если сравниваемыестроки равны, для определения равенства символьных строк, как правило, лучше пользоваться методом Equals() иди же оператором = =. Дело в том, что метод Compare()определяет равенство сравниваемых строк на основании порядка их сортировки. Так,если выполняется сравнение строк с учетом культурной среды, то обе строки могутоказаться одинаковыми по порядку их сортировки, но не равными по существу. Поумолчанию равенство строк определяется в методе Equals(), исходя из порядковыхзначений символов и без учета культурной среды. Следовательно, по умолчанию обестроки сравниваются в этом методе на абсолютное, посимвольное равенство подобнотому, как это делается в операторе = =.
Несмотря на большую универсальность метода Compare(), для простого порядкового сравнения символьных строк проще пользоваться методом CompareOrdinal().И наконец, следует иметь в виду, что метод CompareTo() выполняет сравнение строктолько с учетом культурной среды. На момент написания этой книги отсутствовалиперегружаемые варианты этого метода, позволявшие указывать другой способ сравнения символьных строк.
В приведенной ниже программе демонстрируется применение методов Compare(),Equals(), CompareOrdinal(), а также операторов = = и != для сравнения символьных строк. Обратите внимание на то, что два первых примера сравнения наглядно демонстрируют отличия между сравнением строк с учетом культурной среды и порядковым сравнением в англоязычной среде.// Продемонстрировать разные способы сравнения символьных строк.using System;class CompareDemo { static void Main() { string str1 = "alpha"; string str2 = "Alpha"; string str3 = "Beta"; string str4 = "alpha"; string str5 = "alpha, beta"; int result; // Сначала продемонстрировать отличия между сравнением строк // с учетом культурной среды и порядковым сравнением. result = String.Compare(str1, str2, StringComparison.CurrentCulture) Console.Write("Сравнение строк с учетом культурной среды: "); if(result < 0) Console.WriteLine(str1 + " меньше " + str2); else if(result > 0) Console.WriteLine(str1 + " больше " + str2); else Console.WriteLine(str1 + " равно " + str2); result = String.Compare(str1, str2, StringComparison.Ordinal); Console.Write("Порядковое сравнение строк: "); if(result < 0) Console.WriteLine(str1 + " меньше " + str2); else if(result > 0) Console.WriteLine(str1 + " больше " + str2); else Console.WriteLine(str1 + " равно " + str4); // Использовать метод CompareOrdinal(). result = String.CompareOrdinal(str1, str2); Console.Write("Сравнение строк методом CompareOrdinal():n"); if(result < 0) Console.WriteLine(str1 + " меньше " + str2); else if(result > 0) Console.WriteLine(str1 + " больше " + str2); else Console.WriteLine(str1 + " равно " + str4); Console.WriteLine(); // Определить равенство строк о помощью оператора = = . // Это порядковое сравнение символьных строк. if(str1 == str4) Console.WriteLine(str1 + " == " + str4); // Определить неравенство строк с помощью оператора !=. if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Console.WriteLine(str1 + " != " + str2); Console.WriteLine(); // Выполнить порядковое сравнение строк без учета регистра, // используя метод Equals(). if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("Сравнение строк методом Equals() с " + "параметром OrdinalIgnoreCase:n" + str1 + " равно " + str2); Console.WriteLine (); // Сравнить части строк. if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) { Console.WriteLine("Сравнение строк с учетом текущей культурной среды:" + "n3 первых символа строки " + str2 + " больше, чем 3 первых символа строки " + str5); } }}
Выполнение этой программы приводит к следующему результату.Сравнение строк с учетом культурной среды: alpha меньше AlphaПорядковое сравнение строк: alpha больше AlphaСравнение строк методом CompareOrdinal():alpha больше Alphaalpha == alphaalpha != Betaalpha != AlphaСравнение строк методом Equals() с параметром OrdinalIgnoreCase:alpha равно AlphaСравнение строк с учетом текущей культурной среды:3 первых символа строки Alpha больше, чем 3 первых символа строки alpha, betaСцепление строк
Строки можно сцеплять, т.е. объединять вместе, двумя способами. Во-первых, с помощью оператора +, как было показано в главе 7. И во-вторых, с помощью одного изметодов сцепления, определенных в классе String. Конечно, для этой цели прощевсего воспользоваться оператором +, тем не менее методы сцепления служат неплохойальтернативой такому подходу.
Метод, выполняющий сцепление строк, называется Concat(). Ниже приведенаодна из самых распространенных его форм.public static string Concat(string str0, string str1)
Этот метод возвращает строку, состоящую из строки str1, присоединяемой путемсцепления в конце строки str0. Ниже приведена еще одна форма метода Concat(),в которой сцепляются три строки.public static string Concat(string str0, string str1,string str2)
В данной форме метод Concat() возвращает строку, состоящую из последовательно сцепленных строк str0, str1 и str2.
Имеется также форма метода Concat(), в которой сцепляются четыре строки.public static string Concat(string str0, string str1, string str2, string str3)
В этой форме метод Concat() возвращает строку, состоящую из четырех последовательно сцепленных строк.
А в приведенной ниже еще одной форме метода Concat() сцепляется произвольное количество строк:public static string Concat(params string[] values)
где values обозначает переменное количество аргументов, сцепляемых для получения возвращаемого результата. Если в этой форме метода Concat() допускается сцепление произвольного количества строк, то зачем нужны все остальные его формы?Они существуют ради повышения эффективности. Ведь передача методу от одного дочетырех аргументов оказывается намного эффективнее, чем использование для этойцели переменного списка аргументов.