- •А.А. Волосевич
- •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. Диагностика
6. Операторы работы с множествами.
В LINQ to Objects имеется набор операторов для работы с множествами.
IEnumerable<T> Distinct<T>(this IEnumerable<T> source);
IEnumerable<T> Union<T>(this IEnumerable<T> first,
IEnumerable<T> second);
IEnumerable<T> Intersect<T>(this IEnumerable<T> first,
IEnumerable<T> second);
IEnumerable<T> Except<T>(this IEnumerable<T> first,
IEnumerable<T> second);
Оператор Distinct() удаляет из коллекции повторяющиеся элементы. Операторы Union(), Intersect() и Except() представляют объединение, пересечение и разность двух множеств.
7. Операторы агрегирования.
К операторам агрегирования относятся операторы, результатом работы которых является скалярное значение. Следующие операторы возвращают количество элементов коллекции. При этом может быть использована перегруженная версия, принимающая в качестве второго параметра предикат фильтрации.
int Count<T>(this IEnumerable<T> source);
long LongCount<T>(this IEnumerable<T> source);
Следующие операторы подсчитывают сумму и среднее значение в коллекции. При этом Num должен быть числовым типом int, long, float, double, decimal. Допускаются типы с поддержкой null (например, long?).
Num Sum(this IEnumerable<Num> source);
Num Sum<T>(this IEnumerable<T> source, Func<T, Num> selector);
Num Average(this IEnumerable<Num> source);
Num Average<T>(this IEnumerable<T> source, Func<T, Num> selector);
Существует также несколько перегруженных версий операторов для нахождения минимального и максимального значений.
Num Min/Max(this IEnumerable<Num> source);
Num Min<T>/Max<T>(this IEnumerable<T> src, Func<T, Num> selector);
T Min<T>/Max<T>(this IEnumerable<T> source);
S Min<T, S>/Max<T, S>(this IEnumerable<T> src, Func<T, S> selector);
Первые две версии применяются для коллекций с числовым элементом. Последние две предполагают, что элемент коллекции реализует интерфейс IComparable<T>.
Оператор Aggregate() позволяет выполнить для коллекции собственный алгоритм агрегирования. Его простейшая форма:
T Aggregate<T>(this IEnumerable<T> source, Func<T, T, T> func);
Функция func принимает два аргумента: значение-аккумулятор и текущее значение коллекции. Результат функции перезаписывается в аккумулятор. В следующем примере оператор Aggregate() применяется для обращения строки:
var text = "The quick brown fox jumps over the lazy dog";
string[] words = text.Split(' ');
var reversed = words.Aggregate((acc, next) => next + " " + acc);
8. Операторы генерирования.
Эта группа операторов позволяет создать набор данных. Первый оператор группы – оператор Range(). Он просто выдаёт указанное количество подряд идущих целых чисел, начиная с заданного значения.
IEnumerable<int> Range(int start, int count);
Продемонстрируем использование Range() в задаче поиска простых чисел:
var primes = Enumerable.Range(2, 999).
Where(x => !Enumerable.Range(2, (int) Math.Sqrt(x)).
Any(y => x != y && x%y == 0));
foreach (var prime in primes)
{
Console.WriteLine(prime);
}
Следующий оператор генерирования – оператор Repeat(). Он создает коллекцию, в которой указанный элемент повторяется требуемое число раз. Для ссылочных типов дублируются ссылки, а не содержимое.
IEnumerable<T> Repeat<T>(T element, int count);
Покажем не совсем стандартное применение Repeat() для генерирования последовательности случайных чисел:
Random rnd = new Random();
var r1 = Enumerable.Repeat(0, 20).Select(i => rnd.Next(0, 40));
Последним генерирующим оператором является оператор Empty(), который порождает пустое перечисление определенного типа.
IEnumerable<T> Empty<T>();