Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }