- •А.А. Волосевич
- •2. Базовые технологии платформы .Net 5
- •2. Базовые технологии платформы .Net 4
- •2. Базовые технологии платформы .Net
- •2.1. Работа с Числами
- •2.2. Дата и время
- •2.3. Работа со строками и текстом
- •2.4. Преобразование информации
- •2.5. Отношения равенства и порядка
- •Сравнение для выяснения равенства
- •Сравнение для выяснения порядка
- •2.6. Жизненный цикл объектов
- •Алгоритм «сборки мусора»
- •Финализаторы и интерфейс iDisposable
- •2.7. Перечислители и итераторы
- •2.8. Интерфейсы стандартных коллекций
- •2.9. Массивы и класс system.Array
- •2.10. Типы для работы с коллекциями-списками
- •2.11. Типы для работы с коллекциями-множествами
- •2.12. Типы для работы с коллекциями-словарями
- •2.13. Типы для создания пользовательских коллекций
- •2.14. Технология linq to objects
- •1. Оператор условия Where().
- •2. Операторы проекций.
- •3. Операторы упорядочивания.
- •4. Оператор группировки GroupBy().
- •5. Операторы соединения.
- •6. Операторы работы с множествами.
- •7. Операторы агрегирования.
- •8. Операторы генерирования.
- •9. Операторы кванторов и сравнения.
- •10. Операторы разбиения.
- •11. Операторы элемента.
- •12. Операторы преобразования.
- •2.15. Работа с объектами файЛовой системы
- •2.16. Ввод и вывод информации
- •Потоки данных и декораторы потоков
- •2. Классы для работы с потоками, связанными с хранилищами.
- •3. Декораторы потоков.
- •4. Адаптеры потоков.
- •Адаптеры потоков
- •2.17. Основы xml
- •2.18. Технология linq to xml
- •Создание, сохранение, загрузка xml
- •Запросы, модификация и трансформация xml
- •Пространства имен xml
- •2.19. ДОполнительные возможности обработки xml
- •2.20. Сериализация
- •Сериализация времени выполнения
- •Сериализация контрактов данных
- •2.21. Состав и взаимодействие сборок
- •2.22. Метаданные и получение информации о типах
- •2.23. Позднее связывание и кодогенерация
- •2.24. Динамические типы
- •2.25. Атрибуты
- •2.26. Файлы конфигуРации
- •2.27. Основы мНогопоточноГо программирования
- •2.28. Синхронизация потоков
- •2.29. Библиотека параллельных расширений
- •Параллелизм на уровне задач
- •Параллелизм при императивной обработке данных
- •Параллелизм при декларативной обработке данных
- •Обработка исключений и отмена выполнения задач
- •Коллекции, поддерживающие параллелизм
- •2.30. Асинхронный вызов методов
- •2.31. Процессы и домены
- •2.32. Безопасность
- •Разрешения на доступ
- •Изолированные хранилища
- •Криптография
- •2.33. Диагностика
Сравнение для выяснения порядка
Стандартным способом сравнения для выяснения порядка является реализация типом интерфейсов 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 возвращает объект, реализующий сравнение строк с учетом текущих региональных стандартов.