Использовать операторы set в C#
В этом примере показано, как переопределить эти операторы, чтобы упростить операции установки.
Чтобы переопределить эти операторы, вам нужно добавить код в класс. Вы можете добавить код с помощью частичного ключевого слова, но это работает только в том случае, если для каждой другой части класса используется ключевое слово, а класс HashSet Microsoft не использует это ключевое слово. Другими словами, вы не можете добавить код в существующий класс таким образом.
Чтобы обойти эту проблему, в этом примере получается класс Set, который наследуется от HashSet. Это также позволяет мне использовать немного более интуитивное имя класса Set.
В следующем коде показан полный класс Set.
public class Set: HashSet { // Конструкторы. public Set() : base() { } public Set(IEnumerable enumerable) : base(enumerable) { } public Set(IEqualityComparer comparer) : base(comparer) { } public Set(IEnumerable enumerable, IEqualityComparer comparer) : base(enumerable, comparer) { } // Союз. public static Set operator |(Set A, Set B) { Set result = new Set (A); result.UnionWith(B); return result; } // Пересечение. public static Set operator &(Set A, Set B) { Set result = new Set (A); result.IntersectWith(B); return result; } // Xor. public static Set operator ^(Set A, Set B) { Set result = new Set (A); result.SymmetricExceptWith(B); return result; } // Подмножество. public static bool operator <(Set A, Set B) { return A.IsSubsetOf(B); } // Суперсет. public static bool operator >(Set A, Set B) { return A.IsSupersetOf(B); } // Содержит элемент. public static bool operator >(Set A, T element) { return A.Contains(element); } // Состоит из одного элемента. public static bool operator <(Set A, T element) { return (A > element) && (A.Count == 1); } }
Класс начинается с конструкторов, которые просто вызывают конструкторы базового класса. Они необходимы, поэтому основная программа может создать Set, и поэтому операторы могут создавать новые объекты Set.
Операторы объединения двоичных (двух операндов), пересечений и XOR копируют первый операнд, а затем используют соответствующий метод HashSet для объединения копии со вторым набором.
Операторы подмножества и superset просто вызывают методы HashSet класса IsSubsetOf и IsSupersetOf.