Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базовые технологии платформы .NET.docx
Скачиваний:
15
Добавлен:
02.11.2018
Размер:
626.37 Кб
Скачать

Сравнение для выяснения порядка

Стандартным способом сравнения для выяснения порядка является реализация типом интерфейсов IComparable и IComparable<T>:

public interface IComparable

{

int CompareTo(object other);

}

public interface IComparable<in T>

{

int CompareTo(T other);

}

Оба интерфейса представляют одинаковый функционал. Универсальный интерфейс IComparable<T> избавляет от необходимости упаковки при работе с типами значений. Метод x.CompareTo(y) должен возвращать положительное число, если x «больше» y, отрицательное число, если x «меньше» y, и ноль, если x и y равны.

Базовые типы реализуют обе версии интерфейса IComparable. В типе string метод CompareTo() выполняет чувствительное к регистру сравнение строк с учетом региональных стандартов. В некоторых базовых типах дополнительно определён статический метод сравнения Compare(). Например, тип string имеет перегруженные версии Compare(), которые принимают или параметр StringComparison, или булевский флаг (игнорирование регистра) и объект CultureInfo:

// порядковое сравнение

int i = string.Compare("Strasse", "Straße", StringComparison.Ordinal);

// создадим объект с информацией о немецкой культуре

CultureInfo german = CultureInfo.GetCultureInfo("de-DE");

// значение i равно 0 – в немецком языке такие слова равны

i = string.Compare("Strasse", "Straße", false, german);

Кроме реализации IComparable и IComparable<T> тип может перегружать операции < и >. Перегрузка операций сравнения обычно выполняется, если результат операции не зависит от контекста выполнения1.

bool after2012 = DateTime.Now > new DateTime(2012, 1, 1);

Как и в случае проверки на равенство, сравнение для выяснения порядка можно выполнить при помощи подключаемых интерфейсов. Для порядкового сравнения предназначены интерфейсы IComparer<T> и IComparer (пространства имён System.Collections.Generic и System.Collections).

public interface IComparer

{

int Compare(object x, object y);

}

public interface IComparer<in T>

{

int Compare(T x, T y);

}

Существует абстрактный класс System.Collections.Generic.Comparer<T>, облегчающий реализацию интерфейсов IComparer<T> и IComparer:

public class Wish

{

public string Name { get; set; }

public int Priority { get; set; }

}

public class PriorityComparer : Comparer<Wish>

{

public override int Compare(Wish x, Wish y)

{

if (Equals(x, y)) return 0;

return x.Priority.CompareTo(y.Priority);

}

}

Статическое свойство Comparer<T>.Default возвращает экземпляр Comparer<T> для типа T. Этот экземпляр использует метод CompareTo(T) либо метод CompareTo(object) в зависимости от того, реализует ли T интерфейс IComparable<T>.

Абстрактный класс System.StringComparer предназначен для сравнения строк с учетом языка и регистра. Этот класс реализует интерфейсы IComparer, IEqualityComparer, IComparer<string> и IEqualityComparer<string>. Некоторые неабстрактные наследники StringComparer доступны через его статические свойства. Например, свойство StringComparer.CurrentCulture возвращает объект, реализующий сравнение строк с учетом текущих региональных стандартов.