В предыдущей части мы рассматривали операции с множествами, которые были представлены в качестве экземпляров специальных классов HashSet и SortedSet. Однако довольно часто множества могут быть представлены и в виде обычных массивов. Как поступить в этом случае?
На самом деле для массивов применимы практически те же самые подходы, что и для классов множеств. Единственное отличие вместо методов классов используются соответствующие методы расширения LINQ. При этом реализация практически не отличается от той, что была приведена в первой части (ссылка в конце статьи) за исключением симметрической разности.
Однако нужно учитывать, что используемые методы расширения возвращают IEnumerable. Поэтому при необходимости получить результат в виде массива необходимо приведение типов при помощи метода расширения ToArray.
Допустим есть два массива целых чисел.
1 2 |
int[] a = { 1, 15, 45, 7, 8, 22, 73, 10 }; int[] b = { 7, 8, 22, 42, 12 }; |
Поработаем с ними как со множествами.
Операции с множествами
Объединение
Получение нового множества, которое содержит все элементы исходных множеств.
Математическое обозначение:
Выполняется с помощью метода расширения Union.
1 |
int[] c = a.Union(b).ToArray(); |
Для приведённых выше множеств результат будет:
1 15 45 7 8 22 73 10 42 12
Пересечение
Выбор одинаковых элементов в обоих множествах.
Математическое обозначение:
Выполняется с помощью метода Intersect.
1 |
int[] c = a.Intersect(b).ToArray(); |
Для приведённых выше множеств результат будет:
7 8 22
Разность
Выбор из одного множества только тех элементов, что отсутствуют в другом.
Математическое обозначение:
Выполняется с помощью метода Except.
1 |
int[] c = a.Except(b).ToArray(); |
Для приведённых выше множеств результат будет:
1 15 45 73 10
Симметрическая разность
Выбор из обоих множеств элементов, которые не принадлежат одновременно обоим множествам.
Математическое обозначение:
Для этой операции нет специального метода расширения. Поэтому она выполняется при помощи LINQ запроса. Как вариант:
1 |
int[] c = (from r in a.Union(b) where !a.Intersect(b).Contains(r) select r).ToArray(); |
Для приведённых выше множеств результат будет:
1 15 45 12 42 73 10
Таким образом можно оперировать массивами как множествами без преобразования к специальным классам. Это очень удобно так как результат можно получить сразу, не усложняя понапрасну логику работы программы.
Ссылки
- Стрелец Coder. Операции с множествами в C#. Часть 1. Классы HashSet и SortedSet
Добавить комментарий