using System.Collections; using System.Collections.Generic; namespace PgRr.System.Collections.Generic { public class UniqueQueue : IEnumerable, IEnumerable { private HashSet hashSet = new HashSet(); private Queue queue = new Queue(); public int Count => hashSet.Count; public void Clear() { hashSet.Clear(); queue.Clear(); } public bool Contains(T item) => hashSet.Contains(item); public void Enqueue(T item) { if (hashSet.Add(item)) { queue.Enqueue(item); } else { throw new InvalidOperationException("The queue already contains this item"); } } public T Dequeue() { T item = queue.Dequeue(); hashSet.Remove(item); return item; } public T Peek() => queue.Peek(); public IEnumerator GetEnumerator() => queue.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => queue.GetEnumerator(); } }