286 lines
6.5 KiB
C#
286 lines
6.5 KiB
C#
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];
|
||
}
|
||
}
|
||
}
|
||
}
|