- •А.А. Волосевич
- •Содержание
- •1. Работа с числами
- •2. Представление даты и времени
- •3. Работа со строками и текстом
- •4. Преобразование информации
- •5. Сравнение для выяснения равенства
- •6. Сравнение для выяснения порядка
- •7. Жизненный цикл объектов
- •7.1. Алгоритм сборки мусора
- •7.2. Финализаторы и интерфейс iDisposable
- •7.3. Слабые ссылки
- •8. Перечислители и итераторы
- •9. Стандартные интерфейсы коллекций
- •10. Массивы и класс System.Array
- •11. Типы для работы с коллекциями-списками
- •12. Типы для работы с коллекциями-множествами
- •13. Типы для работы с коллекциями-словарями
- •14. Типы для создания пользовательских коллекций
- •15. Технология linq to Objects
- •1. Оператор условия Where().
- •2. Операторы проекций.
- •3. Операторы упорядочивания.
- •4. Оператор группировки GroupBy().
- •5. Операторы соединения.
- •6. Операторы работы с множествами.
- •7. Операторы агрегирования.
- •8. Операторы генерирования.
- •9. Операторы кванторов и сравнения.
- •10. Операторы разбиения.
- •11. Операторы элемента.
- •12. Операторы преобразования.
- •16. Работа с объектами файловой системы
- •17. Ввод и вывод информации
- •17.1. Потоки данных и декораторы потоков
- •2. Классы для работы с потоками, связанными с хранилищами.
- •3. Декораторы потоков.
- •4. Адаптеры потоков.
- •17.2. Адаптеры потоков
- •18. Основы xml
- •19. Технология linq to xml
- •20. Дополнительные возможности обработки xml
- •21. Сериализация времени выполнения
- •22. Контракты данных и xml-сериализация
- •23. Состав и взаимодействие сборок
- •24. Метаданные и получение информации о типах
- •25. Позднее связывание и кодогенерация
- •26. Атрибуты
- •27. Динамическое связывание
- •28. Файлы конфигурации
- •29. Диагностика и мониторинг
- •30. Процессы и домены
- •31. Основы многопоточного программирования
- •32. Синхронизация потоков
- •32.1. Критические секции
- •32.2. Синхронизация на основе подачи сигналов
- •32.3. Неблокирующие средства синхронизации
- •32.4. Разделение данных между потоками
- •33. Библиотека параллельных задач
- •33.1. Параллелизм на уровне задач
- •33.2. Параллелизм при императивной обработке данных
- •33.3. Параллелизм при декларативной обработке данных
- •33.4. Обработка исключений и отмена выполнения задач
- •33.5. Коллекции, поддерживающие параллелизм
- •34. Асинхронный вызов методов
- •Литература
9. Операторы кванторов и сравнения.
Операторы кванторов похожи на соответствующие операторы в математической логике.
bool Any<T>(this IEnumerable<T> source, Func<T, bool> predicate);
bool Any<T>(this IEnumerable<T> source);
bool All<T>(this IEnumerable<T> source, Func<T, bool> predicate);
bool Contains<T>(this IEnumerable<T> source, T value);
bool Contains<T>(this IEnumerable<T> source, T value,
IEqualityComparer<T> comparer)
Оператор Any() проверяет наличие хотя бы одного элемента в коллекции, удовлетворяющего указанному предикату. Вторая версия оператора Any() просто проверяет коллекцию на непустоту. Оператор All() возвращает true, если все элементы коллекции удовлетворяют предикату. И, наконец, оператор Contains() проверяет, входит ли заданное значение в коллекцию.
Оператор SequenceEqual() сравнивает две коллекции и возвращает true, если обе коллекции имеют одинаковую длину, и их соответствующие элементы равны:
bool SequenceEqual<T>(this IEnumerable<T> first,
IEnumerable<T> second);
bool SequenceEqual<T>(this IEnumerable<T> first,
IEnumerable<T> second,
IEqualityComparer<T> comparer);
10. Операторы разбиения.
Операторы разбиения выделяют некую часть исходной коллекции (например, первые десять элементов).
IEnumerable<T> Take<T>(this IEnumerable<T> source, int count);
IEnumerable<T> TakeWhile<T>(this IEnumerable<T> source,
Func<T, bool> predicate);
IEnumerable<T> Skip<T>(this IEnumerable<T> source, int count);
IEnumerable<T> SkipWhile<T>(this IEnumerable<T> source,
Func<T, bool> predicate);
Комбинация операторов Take() и Skip() часто применяется, чтобы организовать постраничный просмотр информации (например, просмотр записей из большой таблицы):
var bigTable = Enumerable.Range(1, 1000);
int pageSize = 20, pageNumber = 6;
var page = bigTable.Skip((pageNumber - 1)*pageSize).Take(pageSize);
11. Операторы элемента.
Эта группа операторов предназначена для выделения из коллекции единственного элемента, удовлетворяющего определённым условиям.
Оператор First() выделяет первый элемент (или первый элемент, удовлетворяющий определённому предикату).
T First<T>(this IEnumerable<T> source);
T First<T>(this IEnumerable<T> source, Func<T, bool> predicate);
Если в коллекции нет элементов, или не нашлось элементов, удовлетворяющих предикату, оператор First() выбрасывает исключение InvalidOperationException. Если требуется, чтобы исключение не выбрасывалось, а возвращалось предопределённое значение для типа, следует использовать оператор FirstOrDefault().
T FirstOrDefault<T>(this IEnumerable<T> source);
T FirstOrDefault<T>(this IEnumerable<T> source,
Func<T, bool> predicate);
Аналогично работают операторы Last() и LastOrDefault() для выделения последнего элемента.
Операторы Single() и SingleOrDefault() рассчитаны на то, что коллекция (или набор элементов, удовлетворяющих предикату) будет состоять из одного элемента, который данные операторы и возвращают. Если в коллекции нет элементов, или их оказалось больше одного, оператор Single() выбрасывает исключение InvalidOperationException. Оператор SingleOrDefault() выбрасывает такое исключение, если элементов оказалось больше одного.
Пара операторов ElementAt() и ElementAtOrDefault() пытаются вернуть элемент на указанной целочисленной позиции.
Оператор DefaultIfEmpty() проверяет коллекцию на пустоту. Если в коллекции нет элементов, то возвращается или значение по умолчанию для типа, или указанное значение. Если коллекция непустая, то она и возвращается.
IEnumerable<T> DefaultIfEmpty<T>(this IEnumerable<T> source);
IEnumerable<T> DefaultIfEmpty<T>(this IEnumerable<T> source,
T defaultValue);