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];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|