Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство_по_C#.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
10 Мб
Скачать
☆

Немного о сравнении строк в c#

Вероятно, из всех операций обработки символьных строк чаще всего выполняется сравнение одной строки с другой. Прежде чем рассматривать какие-либо методы сравнения строк, следует подчеркнуть следующее: сравнение строк может быть выполнено в среде .NET Framework двумя основными способами.

Во-первых, сравнение может отражать обычаи и нормы отдельной культурной среды, которые зачастую представляют собой настройки культурной среды, вступающие в силу при выполнении программы. Это стандартное поведение некоторых, хотя и не всех методов сравнения.

И во-вторых, сравнение может быть выполнено независимо от настроек культурной среды только по порядковым значениям символов, составляющих строку. Вообще говоря, при сравнении строк без учета культурной среды используется лексикографический порядок (и лингвистические особенности), чтобы определить, является ли одна строка больше, меньше или равной другой строке. При порядковом сравнении строки просто упорядочиваются на основании невидоизмененного значения каждого символа.

В силу отличий способов сравнения строк с учетом культурной среды и порядкового сравнения, а также последствий каждого такого сравнения настоятельно рекомендуется руководствоваться лучшими методиками, предлагаемыми в настоящее время корпорацией Microsoft. Ведь выбор неверного способа сравнения строк может привести к неправильной работе программы, когда она эксплуатируется в среде, отличающей от той, в которой она разработана.

Выбор способа сравнения символьных строк представляет собой весьма ответственное решение. Как правило и без всякий исключений, следует выбирать сравнение строк с учетом культурной среды, если это делается для целей отображения результата пользователю (например, для вывода на экран ряда строк, отсортированных в лексикографическом порядке). Но если строки содержат фиксированную информацию, не предназначенную для видоизменения с учетом отличий в культурных средах, например, имя файла, ключевое слово, адрес веб-сайта или значение, связанное с обеспечением безопасности, то следует выбрать порядковое сравнение строк. Разумеется, особенности конкретного разрабатываемого приложения будут диктовать выбор подходящего способа сравнения символьных строк.

В классе String предоставляются самые разные методы сравнения строк, которые перечислены в таблице выше. Наиболее универсальным среди них является метод Compare(). Он позволяет сравнивать две строки полностью или частично, с учетом или без учета регистра, способа сравнения, определяемого параметром типа StringComparison, а также сведений о культурной среде, предоставляемых с помощью параметра типа CultureInfo.

Те перегружаемые варианты метода Compare(), которые не содержат параметр типа StringComparison, выполняют сравнение символьных строк с учетом регистра и культурной среды. А в тех перегружаемых его вариантах, которые не содержат параметр типа CultureInfo, сведения о культурной среде определяются текущей средой выполнения.

Тип StringComparison представляет собой перечисление, в котором определяются значения, приведенные в таблице ниже. Используя эти значения, можно организовать сравнение строк, удовлетворяющее потребностям конкретного приложения. Следовательно, добавление параметра типа StringComparison расширяет возможности метода Compare() и других методов сравнения, например, Equals(). Это дает также возможность однозначно указывать способ предполагаемого сравнения строк.

В силу имеющихся отличий между сравнением строк с учетом культурной среды и порядковым сравнением очень важно быть предельно точным в этом отношении.

Значения, определяемые в перечислении StringComparison

Значение

Описание

CurrentCulture

Сравнение строк производится с использованием текущих настроек параметров культурной среды

CurrentCultureIgnoreCase

Сравнение строк производится с использованием текущих настроек параметров культурной среды, но без учета регистра

InvariantCulture

Сравнение строк производится с использованием неизменяемых, т.е. универсальных данных о культурной среде

InvariantCultureIgnoreCase

Сравнение строк производится с использованием неизменяемых, т.е. универсальных данных о культурной среде и без учета регистра

Ordinal

Сравнение строк производится с использованием порядковых значений символов в строке. При этом лексикографический порядок может нарушиться, а условные обозначения, принятые в отдельной культурной среде, игнорируются

OrdinalIgnoreCase

Сравнение строк производится с использованием порядковых значений символов в строке, но без учета регистра

В любом случае метод Compare() возвращает отрицательное значение, если первая сравниваемая строка оказывается меньше второй; положительное значение, если первая сравниваемая строка больше второй; и наконец, нуль, если обе сравниваемые строки равны. Несмотря на то что метод Compare() возвращает нуль, если сравниваемые строки равны, для определения равенства символьных строк, как правило, лучше пользоваться методом Equals() или же оператором ==.

Дело в том, что метод Compare() определяет равенство сравниваемых строк на основании порядка их сортировки. Так, если выполняется сравнение строк с учетом культурной среды, то обе строки могут оказаться одинаковыми по порядку их сортировки, но не равными по существу. По умолчанию равенство строк определяется в методе Equals(), исходя из порядковых значений символов и без учета культурной среды. Следовательно, по умолчанию обе строки сравниваются в этом методе на абсолютное, посимвольное равенство подобно тому, как это делается в операторе ==.

Несмотря на большую универсальность метода Compare(), для простого порядкового сравнения символьных строк проще пользоваться методом CompareOrdinal(). И наконец, следует иметь в виду, что метод CompareTo() выполняет сравнение строк только с учетом культурной среды.

В приведенной ниже программе демонстрируется применение методов Compare(), Equals(), CompareOrdinal(), а также операторов == и != для сравнения символьных строк. Обратите внимание на то, что два первых примера сравнения наглядно демонстрируют отличия между сравнением строк с учетом культурной среды и порядковым сравнением в англоязычной среде:

using System;

class Example

{

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