Полное руководство. С# 4.0
Шрифт:
В любом случае метод 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 больше Alpha alpha == alpha alpha != Beta alpha != 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 допускается сце пление произвольного количества строк, то зачем нужны все остальные его формы? Они существуют ради повышения эффективности. Ведь передача методу от одного до четырех аргументов оказывается намного эффективнее, чем использование для этой цели переменного списка аргументов.
В приведенном ниже примере программы демонстрируется применение метода Concat в форме с переменным списком аргументов. // Продемонстрировать применение метода Concat. using System; class ConcatDemo { static void Main { string result = String.Concat("Это ", "тест ", "метода ", "сцепления ", "строк ", "из класса ", "String." ); Console.WriteLine("Результат: " + result); } }
Эта программа дает следующий результат. Результат: Это тест метода сцепления строк из класса String.
Кроме того, существуют варианты метода Concat, в которых он принима ет в качестве параметров ссылки на объекты, а не на строки. В этих вариантах метод Concat получает строковые представления вызывающих объектов, а возвращает объединенную строку, сцепленную из этих представлений. (Строковые представления объектов получаются с помощью метода ToString, вызываемого для этих объек тов.) Ниже приведены все подобные варианты и формы метода Concat. public static string Concat(object arg0) public static string Concat(object arg0, object arg1) public static string Concat(object arg0, object arg1, object arg2) public static string Concat(object arg0, object arg1, object arg2, object arg3) public static string Concat(params object[] args)
В первой форме метод Concat возвращает строку, эквивалентную объекту arg0, а в остальных формах — строку, получаемую в результате сцепления всех аргументов данного метода. Объектные формы метода Concat, т.е. относящиеся к типу object, очень удобны, поскольку они исключают получение вручную строковых представле ний объектов перед их сцеплением. В приведенном ниже примере программы нагляд но демонстрируется польза от подобных форм метода Concat. // Продемонстрировать применение объектной формы метода Concat. using System; class MyClass { public static int Count = 0; public MyClass { Count++; } } class ConcatDemo { static void Main { string result = String.Concat("значение равно " + 19); Console.WriteLine("Результат: " + result); result = String.Concat("привет ", 88, " ", 20.0, " ", false, " ", 23.45M); Console.WriteLine("Результат: " + result); MyClass me = new MyClass; result = String.Concat(me, " текущий счет равен ", MyClass.Count); Console.WriteLine("Результат: " + result); } }
Вот к какому результату приводит выполнение этой программы. Результат: значение равно 19 Результат: привет 88 20 False 23.45 Результат: MyClass текущий счет равен 1
В данном примере метод Concat сцепляет строковые представления различных типов данных. Для каждого аргумента этого метода вызывается соответствующий ме тод ToString, с помощью которого получается строковое представление аргумента. Следовательно, в следующем вызове метода Concat: string result = String.Concat("значение равно " + 19);
метод Int32.ToString вызывается для получения строкового представления цело го значения 19, а затем метод Concat сцепляет строки и возвращает результат.
Обратите также внимание на применение объекта определяемого пользователем класса MyClass в следующем вызове метода Concat. result = String.Concat(me, " текущий счет равен ", MyClass.Count);
В данном случае возвращается строковое представление объекта типа MyClass, сцепленное с указываемой строкой. По умолчанию это просто имя класса. Но если переопределить метод ToString, то вместо строки с именем класса MyClass может быть возвращена другая строка. В качестве упражнения попробуйте ввести в приведен ный выше пример программы следующий фрагмент кода. public override string ToString { return "Объект типа MyClass"; }