Exemplo n.º 1
0
        /// <summary>
        /// 请尽可能的使用AddMany(...) 比 Add(...) 添加单个快得多
        /// </summary>
        /// <param name="serial"></param>
        /// <param name="realm"></param>
        public void AddMany(KeyT key, IEnumerable <ValueT> values)
        {
            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.AddMany(key, values);
            } while (Interlocked.CompareExchange <MultiDictionary <KeyT, ValueT> >(ref m_MultiDictionary, newMultiDict, oldMultiDict) != oldMultiDict);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 请尽可能的使用AddMany(...) 比 Add(...) 添加单个快得多
        /// </summary>
        /// <param name="serial"></param>
        /// <param name="realm"></param>
        public void AddMany(KeyT key, IEnumerable <ValueT> values)
        {
            m_LockMultiDictionary.EnterWriteLock();
            {
                m_MultiDictionary.AddMany(key, values);

                m_bIsValueChange = true;
            }
            m_LockMultiDictionary.ExitWriteLock();
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        /// <param name="values"></param>
        public void ReplaceMany(KeyT key, IEnumerable <ValueT> values)
        {
            MultiDictionary <KeyT, ValueT> newMultiDict = null;
            MultiDictionary <KeyT, ValueT> oldMultiDict = null;

            newMultiDict = new MultiDictionary <KeyT, ValueT>(m_AllowDuplicateValues);
            newMultiDict.AddMany(key, values);

            do
            {
                oldMultiDict = m_MultiDictionary;
            } while (Interlocked.CompareExchange <MultiDictionary <KeyT, ValueT> >(ref m_MultiDictionary, newMultiDict, oldMultiDict) != oldMultiDict);
        }