/// <summary> /// /// </summary> /// <param name="key"></param> /// <returns></returns> public bool Remove(KeyT key) { bool bReturn = false; m_LockMultiDictionary.EnterWriteLock(); { bReturn = m_MultiDictionary.Remove(key); m_bIsValueChange = true; } m_LockMultiDictionary.ExitWriteLock(); return(bReturn); }
/// <summary> /// /// </summary> /// <param name="match"></param> /// <returns></returns> public int RemoveAll(Predicate <KeyT, ValueT> match) { MultiDictionary <KeyT, ValueT> tempMultiDictionary = m_MultiDictionary; if (tempMultiDictionary.Count <= 0) { return(0); } List <KeyValuePair <KeyT, ValueT> > removeList = new List <KeyValuePair <KeyT, ValueT> >(tempMultiDictionary.Count); foreach (KeyValuePair <KeyT, ICollection <ValueT> > keyValuePair in tempMultiDictionary) { foreach (ValueT valueItem in keyValuePair.Value) { if (match(keyValuePair.Key, valueItem) == true) { removeList.Add(new KeyValuePair <KeyT, ValueT>(keyValuePair.Key, valueItem)); } } } if (removeList.Count <= 0) { return(0); } int iRemoveCount = 0; MultiDictionary <KeyT, ValueT> newMultiDict = null; MultiDictionary <KeyT, ValueT> oldMultiDict = null; do { iRemoveCount = 0; oldMultiDict = m_MultiDictionary; newMultiDict = new MultiDictionary <KeyT, ValueT>(m_AllowDuplicateValues); foreach (var item in oldMultiDict) { newMultiDict.AddMany(item.Key, item.Value); } foreach (KeyValuePair <KeyT, ValueT> keyValuePair in removeList) { if (newMultiDict.Remove(keyValuePair.Key, keyValuePair.Value) == true) { iRemoveCount++; } } } while (Interlocked.CompareExchange <MultiDictionary <KeyT, ValueT> >(ref m_MultiDictionary, newMultiDict, oldMultiDict) != oldMultiDict); return(iRemoveCount); }
/// <summary> /// /// </summary> /// <param name="serial"></param> public void Remove(KeyT key, ValueT value) { MultiDictionary <KeyT, ValueT> newMultiDict = null; MultiDictionary <KeyT, ValueT> oldMultiDict = null; do { oldMultiDict = m_MultiDictionary; newMultiDict = new MultiDictionary <KeyT, ValueT>(m_AllowDuplicateValues); foreach (var item in oldMultiDict) { newMultiDict.AddMany(item.Key, item.Value); } newMultiDict.Remove(key, value); } while (Interlocked.CompareExchange <MultiDictionary <KeyT, ValueT> >(ref m_MultiDictionary, newMultiDict, oldMultiDict) != oldMultiDict); }