using System; using System.Collections.Generic; namespace KYFramework { public class DoubleMap { private readonly Dictionary kv = new Dictionary(); private readonly Dictionary vk = new Dictionary(); public DoubleMap() { } public DoubleMap(int capacity) { kv = new Dictionary(capacity); vk = new Dictionary(capacity); } public void ForEach(Action action) { if (action == null) { return; } Dictionary.KeyCollection keys = kv.Keys; foreach (K key in keys) { action(key, kv[key]); } } public List Keys { get { return new List(kv.Keys); } } public List Values { get { return new List(vk.Keys); } } public void Add(K key, V value) { if (key == null || value == null || kv.ContainsKey(key) || vk.ContainsKey(value)) { return; } kv.Add(key, value); vk.Add(value, key); } public V GetValueByKey(K key) { if (key != null && kv.ContainsKey(key)) { return kv[key]; } return default(V); } public K GetKeyByValue(V value) { if (value != null && vk.ContainsKey(value)) { return vk[value]; } return default(K); } public void RemoveByKey(K key) { if (key == null) { return; } V value; if (!kv.TryGetValue(key, out value)) { return; } kv.Remove(key); vk.Remove(value); } public void RemoveByValue(V value) { if (value == null) { return; } K key; if (!vk.TryGetValue(value, out key)) { return; } kv.Remove(key); vk.Remove(value); } public void Clear() { kv.Clear(); vk.Clear(); } public bool ContainsKey(K key) { if (key == null) { return false; } return kv.ContainsKey(key); } public bool ContainsValue(V value) { if (value == null) { return false; } return vk.ContainsKey(value); } public bool Contains(K key, V value) { if (key == null || value == null) { return false; } return kv.ContainsKey(key) && vk.ContainsKey(value); } } }