/// <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); }
/// <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(); }
/// <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="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); }