using System.Linq; namespace System.Collections.Generic; public class HashSet : IEnumerable, IEnumerable where T : notnull { private Dictionary hashTable; public int Count => hashTable.Count; public bool IsReadOnly => false; public HashSet(IEqualityComparer? equalityComparer = null) { hashTable = new Dictionary(equalityComparer); } public HashSet(IEnumerable? items, IEqualityComparer? equalityComparer = null) : this(equalityComparer) { if (items == null) { return; } foreach (T item in items) { Add(item); } } public bool Add(T item) { int count = hashTable.Count; hashTable[item] = null; return count != hashTable.Count; } public void Clear() { hashTable.Clear(); } public bool Contains(T item) { return hashTable.ContainsKey(item); } public IEnumerable Except(HashSet otherSet) { return this.Where((T it) => !otherSet.Contains(it)); } public bool IntersectsWith(IEnumerable items) { foreach (T item in items) { if (Contains(item)) { return true; } } return false; } public void CopyTo(T[] array, int arrayIndex) { hashTable.Keys.CopyTo(array, arrayIndex); } public bool Remove(T item) { return hashTable.Remove(item); } public IEnumerator GetEnumerator() { return hashTable.Keys.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return hashTable.Keys.GetEnumerator(); } }