A Small Dictionary Class
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; [DebuggerDisplay("Count = {Count}")] [Serializable] public class TinyDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>> { public MSet15<TKey> Keys; public int Resizes; public TValue[] Values; public TinyDictionary() : this(101, EqualityComparer<TKey>.Default) { } public TinyDictionary(int size) : this(size, EqualityComparer<TKey>.Default) { } public TinyDictionary(int size, IEqualityComparer<TKey> comparer) { if (comparer == null) comparer = EqualityComparer<TKey>.Default; Keys = new MSet15<TKey>(size); Values = new TValue[size]; Keys.Comparer = comparer; } public TinyDictionary(IEnumerable<KeyValuePair<TKey, TValue>> collection, IEqualityComparer<TKey> comparer = null) { if (comparer == null) comparer = EqualityComparer<TKey>.Default; Keys.Comparer = comparer; foreach (var kp in collection) Add(kp.Key, kp.Value); } public int Count => Keys.Count; public TValue this[TKey key] { get { var pos = Keys.FindEntry(key); return pos == -1 ? default : Values[pos]; } set => Add(key, value); } public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() { for (var i = 0; i < Count; i++) if (Keys.Slots[i].HashCode > 0) yield return new KeyValuePair<TKey, TValue>(Keys.Slots[i].Value, Values[i]); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public bool Add(TKey key, TValue value) { if (!Keys.Add(key)) { if (Values.Length != Keys.Slots.Length) { var nValues = new TValue[Keys.Slots.Length]; Array.Copy(Values, nValues, Values.Length); Values = nValues; Resizes++; } Values[Keys.Position] = value; return false; } Values[Keys.Position] = value; return true; } public void Remove(TKey key) { var pos = Keys.FindEntry(key); if (pos != -1) { Values[pos] = default; Keys.Remove(key); } } public bool ContainsKey(TKey key) { return Keys.FindEntry(key) != -1; } public int FindKeyIndex(TKey key) { return Keys.FindEntry(key); } }