Операции с множествами в C#. Часть 2. Массивы

В предыдущей части мы рассматривали операции с множествами, которые были представлены в качестве экземпляров специальных классов HashSet и SortedSet. Однако довольно часто множества могут быть представлены и в виде обычных массивов. Как поступить в этом случае?

На самом деле для массивов применимы практически те же самые подходы, что и для классов множеств. Единственное отличие вместо методов классов используются соответствующие методы расширения LINQ. При этом реализация практически не отличается от той, что была приведена в первой части (ссылка в конце статьи) за исключением симметрической разности.

Однако нужно учитывать, что используемые методы расширения возвращают IEnumerable. Поэтому при необходимости получить результат в виде массива необходимо приведение типов при помощи метода расширения ToArray.

Допустим есть два массива целых чисел.

Поработаем с ними как со множествами.

Операции с множествами
Объединение

Получение нового множества, которое содержит все элементы исходных множеств.

Математическое обозначение: A\cup B

Выполняется с помощью метода расширения Union.

Для приведённых выше множеств результат будет:

1 15 45 7 8 22 73 10 42 12

Пересечение

Выбор одинаковых элементов в обоих множествах.

Математическое обозначение: A\cap B

Выполняется с помощью метода Intersect.

Для приведённых выше множеств результат будет:

7 8 22

Разность

Выбор из одного множества только тех элементов, что отсутствуют в другом.

Математическое обозначение: A\setminus B

Выполняется с помощью метода Except.

Для приведённых выше множеств результат будет:

1 15 45 73 10

Симметрическая разность

Выбор из обоих множеств элементов, которые не принадлежат одновременно обоим множествам.

Математическое обозначение: A\bigtriangleup B

Для этой операции нет специального метода расширения. Поэтому она выполняется при помощи LINQ запроса. Как вариант:

Для приведённых выше множеств результат будет:

1 15 45 12 42 73 10

Таким образом можно оперировать массивами как множествами без преобразования к специальным классам. Это очень удобно так как результат можно получить сразу, не усложняя понапрасну логику работы программы.

Ссылки
  1. Стрелец Coder. Операции с множествами в C#. Часть 1. Классы HashSet и SortedSet

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *