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);
}
}