![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Сравнение для выяснения порядка
Стандартным способом сравнения для выяснения порядка является реализация типом интерфейсов 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: string s1 = " Strasse", s2 = " Straß e";
// порядковое сравнение, i = -108 int i = string.Compare(s1, s2, StringComparison.Ordinal);
// j = 0, так как в немецком языке такие слова равны int j = string.Compare(s1, s2, false, new CultureInfo(" de-DE")); Кроме реализации IComparable и IComparable< T> тип может дополнительно перегружать операции < и >. Перегрузка операций сравнения обычно выполняется, если результат операции не зависит от контекста выполнения[4]. bool isAfterDoomsday = DateTime.Now > new DateTime(2012, 12, 21); Как и в случае проверки на равенство, сравнение для выяснения порядка можно выполнить при помощи подключаемых интерфейсов. Для порядкового сравнения предназначены интерфейсы 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 возвращает объект, реализующий сравнение строк с учётом текущих региональных стандартов.
|