using System.Collections.Generic; using System.Linq; namespace System.Collections.Concurrent { public class ConcurrentSet : ICollection, IEnumerable, IEnumerable { ConcurrentDictionary storage; public ConcurrentSet() { storage = new ConcurrentDictionary(); } public ConcurrentSet(IEnumerable collection) { storage = new ConcurrentDictionary(collection.Select(_ => new KeyValuePair(_, 0))); } public ConcurrentSet(IEqualityComparer comparer) { storage = new ConcurrentDictionary(comparer); } public ConcurrentSet(IEnumerable collection, IEqualityComparer comparer) { storage = new ConcurrentDictionary(collection.Select(_ => new KeyValuePair(_, 0)), comparer); } public ConcurrentSet(int concurrencyLevel, int capacity) { storage = new ConcurrentDictionary(concurrencyLevel, capacity); } public ConcurrentSet(int concurrencyLevel, IEnumerable collection, IEqualityComparer comparer) { storage = new ConcurrentDictionary(concurrencyLevel, collection.Select(_ => new KeyValuePair(_, 0)), comparer); } public ConcurrentSet(int concurrencyLevel, int capacity, IEqualityComparer comparer) { storage = new ConcurrentDictionary(concurrencyLevel, capacity, comparer); } public int Count { get { return storage.Count; } } public bool IsEmptry { get { return storage.IsEmpty; } } public void Clear() { storage.Clear(); } public bool Contains(T item) { return storage.ContainsKey(item); } public bool TryAdd(T item) { return storage.TryAdd(item, 0); } public bool TryRemove(T item) { byte dontCare; return storage.TryRemove(item, out dontCare); } void ICollection.Add(T item) { ((ICollection>)storage).Add(new KeyValuePair(item, 0)); } void ICollection.CopyTo(T[] array, int arrayIndex) { foreach (KeyValuePair pair in storage) array[arrayIndex++] = pair.Key; } bool ICollection.IsReadOnly { get { return false; } } bool ICollection.Remove(T item) { return TryRemove(item); } IEnumerator IEnumerable.GetEnumerator() { return storage.Keys.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return storage.Keys.GetEnumerator(); } } }