При сортировке или поиске в массиве строк может возникнуть потребность явно указать способ сравнения символьных строк. Так, если массив будет сортироваться с использованием одних настроек культурной среды, а поиск в нем — с помощью других настроек, то во избежание ошибок, скорее всего, придется явно указать способ сравнения. Аналогичная ситуация возникает и в том случае, если требуется отсортировать массив символьных строк при настройках культурной среды, отличающихся от текущих. Для выхода из подобных ситуаций можно передать экземпляр объекта типа StringComparer
параметру типа IComparer
, который поддерживается в целом ряде перегружаемых вариантов методов Sort()
и BinarySearch()
.
-----------------------------
ПРИМЕЧАНИЕ
Более подробно особенности сравнения строк рассматриваются в главе 22.
-----------------------------
Класс StringComparer
объявляется в пространстве имен System
и реализует, среди прочего, интерфейсы IComparer
и IComparer<Т>
. Поэтому экземпляр объекта типа StringComparer
может быть передан в качестве аргумента параметру типа IComparer
. Кроме того, в классе StringComparer
определен ряд доступных только для чтения свойств, возвращающих экземпляр объекта типа StringComparer
и поддерживающих различные способы сравнения символьных строк. Все эти свойства перечислены ниже.
Свойство - Способ сравнения
public static StringComparer CurrentCulture {get; } - С учетом регистра и культурной среды
public static StringComparer CurrentCulturelgnoreCase {get; } - Без учета регистра, но с учетом культурной среды
public static StringComparer InvariantCulture {get; } - С учетом регистра и безотносительно к культурной среде
public static StringComparer InvariantCulturelgnoreCase {get; } - Без учета регистра и безотносительно к культурной среде
public static StringComparer Ordinal {get; } - Порядковое сравнение с учетом регистра
public static StringComparer OrdinallgnoreCase {get; } - Порядковое сравнение без учета регистра
Передавая явным образом экземпляр объекта типа StringComparer
, можно совершенно однозначно определить порядок сортировки или поиска в массиве. Например, в приведенном фрагменте кода сортировка и поиск в массиве символьных строк осуществляется с помощью свойства StringComparer.Ordinal
.
string[] strs = { "xyz", "one" , "beta", "Alpha" };
// ...
Array.Sort(strs, StringComparer.Ordinal);
int idx = Array.BinarySearch(strs, "beta", StringComparer.Ordinal);
Иногда оказывается полезно обратить содержимое массива и, в частности, отсортировать по убывающей массив, отсортированный по нарастающей. Для такого обращения массива достаточно вызвать метод Reverse(). С его помощью можно обратить содержимое массива полностью или частично. Этот процесс демонстрируется в приведенной ниже программе.
// Обратить содержимое массива.
using System;
class ReverseDemo {
static void Main() {
int[] nums = { 1, 2, 3, 4, 5 };
// Отобразить исходный порядок следования.
Console.Write("Исходный порядок следования: ");
foreach(int i in nums)
Console.Write(i + " ");
Console.WriteLine();
// Обратить весь массив.
Array.Reverse(nums);
// Отобразить обратный порядок следования.
Console.Write("Обратный порядок следования: ");
foreach(int i in nums)
Console.Write (i + " ");
Console.WriteLine();
// Обратить часть массива.
Array.Reverse(nums, 1, 3);
// Отобразить обратный порядок следования.
Console.Write("Частично обращенный порядок следования: ");
foreach(int i in nums)
Console.Write(i + " ");
Console.WriteLine();
}
}
Эта программа дает следующий результат.
Исходный порядок следования: 1 2 3 4 5