old_flsystem/类库/Api.Framework/Tools/SynchronizedDictionary.cs

286 lines
6.5 KiB
C#
Raw Normal View History

2022-09-20 03:10:29 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Api.Framework.Tools
{
/// <summary>
/// 线程安全的数据字典
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
public class SynchronizedDictionary<TKey, TValue>
{
private Dictionary<TKey, TValue> dic = new Dictionary<TKey, TValue>();
private object obj = new object();
        /// <summary>
        /// 向字典中增加键值对
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public void Add(TKey key, TValue value)
{
lock (obj)
{
if (ContainsKey(key))
{
Remove(key);
}
dic.Add(key, value);
}
}
        /// <summary>
        /// 向字典中添加列表
        /// </summary>
        /// <param name="valueList"></param>
        /// <param name="func"></param>
        public void AddRange(ICollection<TValue> valueList, Func<TValue, TKey> func)
{
lock (obj)
{
if (func != null)
{
TKey key = default(TKey);
foreach (var item in valueList)
{
key = func(item);
if (ContainsKey(key))
{
dic.Remove(key);
}
dic.Add(key, item);
key = default(TKey);
}
}
}
}
        /// <summary>
        /// 清空数据字典
        /// </summary>
        public void Clear()
{
lock (obj)
{
dic.Clear();
}
}
        /// <summary>
        /// 从字典中移除特定的键值对
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool Remove(TKey key)
{
lock (obj)
{
return dic.Remove(key);
}
}
        /// <summary>
        /// 字典是否包含特定的键
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool ContainsKey(TKey key)
{
lock (obj)
{
return dic.ContainsKey(key);
}
}
/// <summary>
        /// 字典是否包含特定的值
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
public bool ContainsValue(TValue value)
{
lock (obj)
{
return dic.ContainsValue(value);
}
}
/// <summary>
        /// 字典中键值对的数目
        /// </summary>
public int Count
{
get
{
lock (obj)
{
return dic.Count;
}
}
}
        /// <summary>
        /// 字典的键集合
        /// </summary>
        public Dictionary<TKey, TValue>.KeyCollection Keys
{
get
{
lock (obj)
{
return dic.Keys;
}
}
}
        /// <summary>
        /// 字典值集合
        /// </summary>
        public Dictionary<TKey, TValue>.ValueCollection Values
{
get
{
lock (obj)
{
return dic.Values;
}
}
}
        /// <summary>
        /// 字典键数组
        /// </summary>
        public TKey[] KeysToArray
{
get
{
lock (obj)
{
TKey[] keys = new TKey[dic.Keys.Count];
dic.Keys.CopyTo(keys, 0);
return keys;
}
}
}
        /// <summary>
        /// 字典值数组
        /// </summary>
        public TValue[] ValuesToArray
{
get
{
lock (obj)
{
TValue[] values = new TValue[dic.Keys.Count];
dic.Values.CopyTo(values, 0);
return values;
}
}
}
/// <summary>
        /// 返回字典循环访问的枚举
        /// </summary>
        /// <returns></returns>
public Dictionary<TKey, TValue>.Enumerator GetEnumerator()
{
lock (obj)
{
return dic.GetEnumerator();
}
}
/// <summary>
        /// 
        /// </summary>
public IEqualityComparer<TKey> Comparer
{
get
{
lock (obj)
{
return dic.Comparer;
}
}
}
        /// <summary>
        /// 通过key获取特定的值
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public TValue this[TKey key]
{
get
{
lock (obj)
{
return dic[key];
}
}
set
{
lock (obj)
{
dic[key] = value;
}
}
}
        ///// <summary>
        ///// 获取字典特定位置的值
        ///// </summary>
        ///// <param name="index"></param>
        ///// <returns></returns>
        public TValue Value(int index)
{
lock (obj)
{
return ValuesToArray[index];
}
}
        /// <summary>
        /// 获取字典特定位置的键
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public TKey Key(int index)
{
lock (obj)
{
return KeysToArray[index];
}
}
}
}