305 lines
7.7 KiB
C#
305 lines
7.7 KiB
C#
|
|
using CYQ.Data.Table;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Data.Common;
|
|||
|
|
using System.Runtime.Serialization;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading;
|
|||
|
|
|
|||
|
|
namespace CYQ.Data.Tool
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>̰߳<DFB3>ȫ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="K">key</typeparam>
|
|||
|
|
/// <typeparam name="V">value</typeparam>
|
|||
|
|
public partial class MDictionary<K, V> : Dictionary<K, V>
|
|||
|
|
{
|
|||
|
|
private ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
|
|||
|
|
public MDictionary()
|
|||
|
|
: base()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
public MDictionary(IEqualityComparer<K> comparer)
|
|||
|
|
: base(comparer)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
public MDictionary(int capacity)
|
|||
|
|
: base(capacity)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
public MDictionary(int capacity, IEqualityComparer<K> comparer)
|
|||
|
|
: base(capacity, comparer)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public new void Add(K key, V value)
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterWriteLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (!ContainsKey(key))
|
|||
|
|
{
|
|||
|
|
base.Add(key, value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitWriteLock();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="key"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public new bool Remove(K key)
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterWriteLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
return base.Remove(key);
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitWriteLock();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ȡֵ<C8A1><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="key"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public new V this[K key]
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterReadLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (base.ContainsKey(key))
|
|||
|
|
{
|
|||
|
|
return base[key];
|
|||
|
|
}
|
|||
|
|
return default(V);
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitReadLock();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterWriteLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (base.ContainsKey(key))
|
|||
|
|
{
|
|||
|
|
base[key] = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitWriteLock();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// ͨ<><CDA8>index<65><78><EFBFBD><EFBFBD>ȡֵ<C8A1><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public V this[int index]
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterReadLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (index >= 0 && index < this.Count)
|
|||
|
|
{
|
|||
|
|
int i = 0;
|
|||
|
|
foreach (V value in this.Values)
|
|||
|
|
{
|
|||
|
|
if (i == index)
|
|||
|
|
{
|
|||
|
|
return value;
|
|||
|
|
}
|
|||
|
|
i++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else // <20><><EFBFBD>ݴ浵hash int
|
|||
|
|
{
|
|||
|
|
K key = ConvertTool.ChangeType<K>(index);
|
|||
|
|
if (base.ContainsKey(key))
|
|||
|
|
{
|
|||
|
|
return base[key];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return default(V);
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitReadLock();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterWriteLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (index >= 0 && index < this.Count)
|
|||
|
|
{
|
|||
|
|
int i = 0;
|
|||
|
|
foreach (K key in this.Keys)
|
|||
|
|
{
|
|||
|
|
if (i == index)
|
|||
|
|
{
|
|||
|
|
this[key] = value;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
i++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
K key = ConvertTool.ChangeType<K>(index);
|
|||
|
|
base[key] = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitWriteLock();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>KeyΪintʱ<74><CAB1>ͨ<EFBFBD><CDA8><EFBFBD>˷<EFBFBD><CBB7><EFBFBD>ȡֵ<C8A1><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="key"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public V Get(K key)
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterReadLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (base.ContainsKey(key))
|
|||
|
|
{
|
|||
|
|
return base[key];
|
|||
|
|
}
|
|||
|
|
return default(V);
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitReadLock();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ڡ<EFBFBD><DAA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¡<EFBFBD><C2A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void Set(K key, V value)
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterWriteLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (base.ContainsKey(key))
|
|||
|
|
{
|
|||
|
|
base[key] = value;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
base.Add(key, value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitWriteLock();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public new void Clear()
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterWriteLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (base.Count > 0)
|
|||
|
|
{
|
|||
|
|
base.Clear();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitWriteLock();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public new bool ContainsKey(K key)
|
|||
|
|
{
|
|||
|
|
if (key == null || base.Count == 0) { return false; }
|
|||
|
|
return base.ContainsKey(key);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public List<K> GetKeys()
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterReadLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
List<K> keys = new List<K>(base.Keys.Count);
|
|||
|
|
foreach (K item in base.Keys)
|
|||
|
|
{
|
|||
|
|
keys.Add(item);
|
|||
|
|
}
|
|||
|
|
return keys;
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitReadLock();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡֵ<C8A1>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public List<V> GetValues()
|
|||
|
|
{
|
|||
|
|
_lock.TryEnterReadLock(Timeout.Infinite);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
List<V> values = new List<V>(base.Values.Count);
|
|||
|
|
foreach (V item in base.Values)
|
|||
|
|
{
|
|||
|
|
values.Add(item);
|
|||
|
|
}
|
|||
|
|
return values;
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_lock.ExitReadLock();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[Serializable]
|
|||
|
|
public partial class MDictionary<K, V>
|
|||
|
|
{
|
|||
|
|
protected MDictionary(SerializationInfo info, StreamingContext context)
|
|||
|
|
: base(info, context)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|