public void Remove(TValue value) { TKey key; lock (ValuesToKey) { key = ValuesToKey[value]; ValuesToKey.Remove(value); } lock (KeyToValues) { HashSet <TValue> values; if (!KeyToValues.TryGetValue(key, out values)) { return; } lock (values) { values.Remove(value); if (values.Count == 0) { KeyToValues.Remove(key); } } } }
public IEnumerable <TValue> GetFromKey(TKey key) { lock (KeyToValues) { HashSet <TValue> values; if (KeyToValues.TryGetValue(key, out values)) { return(values); } } return(Enumerable.Empty <TValue>()); }
public void Add(TKey key, TValue value) { lock (KeyToValues) { HashSet <TValue> values; if (!KeyToValues.TryGetValue(key, out values)) { values = new HashSet <TValue>(); KeyToValues.Add(key, values); } lock (values) values.Add(value); } lock (ValuesToKey) ValuesToKey.Add(value, key); }