using System; using System.Collections.Generic; namespace PDFPatcher.Common { public class DualKeyDictionary : IDictionary { private readonly Dictionary _keyDictionary = new Dictionary(); private readonly Dictionary _reverseDictionary = new Dictionary(); public DualKeyDictionary() { } public K GetKeyByValue(V value) { return _reverseDictionary[value]; } #region IDictionary 成员 public void Add(K key, V value) { _keyDictionary.Add(key, value); _reverseDictionary.Add(value, key); } public bool ContainsKey(K key) { return _keyDictionary.ContainsKey(key); } public bool ContainsValue(V value) { return _reverseDictionary.ContainsKey(value); } public ICollection Keys => _keyDictionary.Keys; public bool Remove(K key) { if (_keyDictionary.ContainsKey(key) == false) { return false; } var value = _keyDictionary[key]; _keyDictionary.Remove(key); _reverseDictionary.Remove(value); return true; } public bool TryGetValue(K key, out V value) { return TryGetValue(key, out value); } public ICollection Values => _reverseDictionary.Keys; public V this[K key] { get => _keyDictionary[key]; set { Remove(key); Add(key, value); } } #endregion #region ICollection> 成员 public void Add(KeyValuePair item) { Add(item.Key, item.Value); } public void Clear() { _keyDictionary.Clear(); _reverseDictionary.Clear(); } public bool Contains(KeyValuePair item) { return _keyDictionary.ContainsKey(item.Key) && _reverseDictionary.ContainsKey(item.Value); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { ((ICollection>)_keyDictionary).CopyTo(array, arrayIndex); } public int Count => _keyDictionary.Count; public bool IsReadOnly => false; public bool Remove(KeyValuePair item) { return Remove(item.Key); } #endregion #region IEnumerable> 成员 public IEnumerator> GetEnumerator() { return ((IEnumerable>)_keyDictionary).GetEnumerator(); } #endregion #region IEnumerable 成员 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return ((System.Collections.IEnumerable)_keyDictionary).GetEnumerator(); } #endregion } }