代码publicclassDictionaryEx<TKey, TValue> : IDictionary<TKey, TValue>{///<summary>用户存储数据的字典///</summary>PRivateIDictionary<TKey, TValue>_items;///<summary>默认值///</summary>privateTValue _defaultValue;///<summary>用于获取值的委托///</summary>privateConverter<TKey, TValue>_getValue;///<summary>1返回_defaultValue, 2执行_getValue, 0抛出异常///</summary>privateint_mode =0;#region构造函数///<summary>初始化 DictionaryEx , key不存在时返回defaultValue///</summary>///<param name="defaultValue">默认值</param>publicDictionaryEx(TValue defaultValue)
{
_items=newDictionary<TKey, TValue>();
_defaultValue=defaultValue;
_mode=1;
}///<summary>初始化 DictionaryEx , key不存在时返回defaultValue///</summary>///<param name="defaultValue">默认值</param>///<param name="comparer">比较键时要使用对象,如果为null则使用默认比较方法</param>publicDictionaryEx(TValue defaultValue, IEqualityComparer<TKey>comparer)
{
_items=newDictionary<TKey, TValue>(comparer);
_defaultValue=defaultValue;
_mode=1;
}///<summary>初始化 DictionaryEx 只读集合, key不存在时返回defaultValue///</summary>///<param name="defaultValue">默认值</param>///<param name="dictionary">内部字典</param>publicDictionaryEx(TValue defaultValue, IDictionary<TKey, TValue>dictionary)
{
Assertor.AreNull(dictionary,"dictionary");
_items=dictionary;
IsReadOnly=true;
_defaultValue=defaultValue;
_mode=1;
}///<summary>初始化 DictionaryEx, key不存在时返回defaultValue///</summary>///<param name="defaultValue">默认值</param>///<param name="dictionary">内部字典</param>///<param name="isReadOnly">是否只读</param>publicDictionaryEx(TValue defaultValue, IDictionary<TKey, TValue> dictionary,boolisReadOnly)
{
Assertor.AreNull(dictionary,"dictionary");
_items=dictionary;
IsReadOnly=isReadOnly;
_defaultValue=defaultValue;
_mode=1;
}///<summary>初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合///</summary>///<param name="getValue">获取值的委托</param>publicDictionaryEx(Converter<TKey, TValue>getValue)
{
Assertor.AreNull(getValue,"getValue");
_items=newDictionary<TKey, TValue>();
_getValue=getValue;
_mode=2;
}///<summary>初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合///</summary>///<param name="getValue">获取值的委托</param>///<param name="comparer">比较键时要使用对象,如果为null则使用默认比较方法</param>publicDictionaryEx(Converter<TKey, TValue> getValue, IEqualityComparer<TKey>comparer)
{
Assertor.AreNull(getValue,"getValue");
_items=newDictionary<TKey, TValue>(comparer);
_getValue=getValue;
_mode=2;
}///<summary>初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合///</summary>///<param name="getValue">获取值的委托</param>///<param name="isReadOnly">集合是否限制外部修改</param>publicDictionaryEx(Converter<TKey, TValue> getValue,boolisReadOnly)
{
Assertor.AreNull(getValue,"getValue");
_items=newDictionary<TKey, TValue>();
_getValue=getValue;
IsReadOnly=isReadOnly;
_mode=2;
}///<summary>初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合///</summary>///<param name="getValue">获取值的委托</param>///<param name="comparer">比较键时要使用对象</param>///<param name="isReadOnly">集合是否限制外部修改</param>publicDictionaryEx(Converter<TKey, TValue> getValue, IEqualityComparer<TKey> comparer,boolisReadOnly)
{
Assertor.AreNull(getValue,"getValue");
_items=newDictionary<TKey, TValue>(comparer);
_getValue=getValue;
IsReadOnly=isReadOnly;
_mode=2;
}///<summary>初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合///</summary>///<param name="getValue">获取值的委托</param>///<param name="dictionary">内部字典</param>publicDictionaryEx(Converter<TKey, TValue> getValue, IDictionary<TKey, TValue>dictionary)
{
Assertor.AreNull(getValue,"getValue");
Assertor.AreNull(dictionary,"dictionary");
_items=dictionary;
_getValue=getValue;
IsReadOnly=true;
_mode=2;
}///<summary>初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合///</summary>///<param name="getValue">获取值的委托</param>///<param name="dictionary">内部字典</param>///<param name="isReadOnly">是否只读</param>publicDictionaryEx(Converter<TKey, TValue> getValue, IDictionary<TKey, TValue> dictionary,boolisReadOnly)
{
_items=dictionary;
_getValue=getValue;
IsReadOnly=isReadOnly;
_mode=2;
}///<summary>初始化 DictionaryEx 只读集合///</summary>///<param name="dictionary">内部字典</param>publicDictionaryEx(IDictionary<TKey, TValue>dictionary)
{
Assertor.AreNull(dictionary,"dictionary");
IsReadOnly=true;
_items=dictionary;
_mode=0;
}#endregionprivateTValue ReturnValue(TKey key)
{switch(_mode)
{case1:return_defaultValue;case2:varvalue =_getValue(key);lock(this)
{
_items[key]=value;
}returnvalue;default:thrownewKeyNotFoundException();
}
}publicvoidAdd(TKey key, TValue value)
{this[key] =value;
}publicboolContainsKey(TKey key)
{return_items.ContainsKey(key);
}publicICollection<TKey>Keys
{get{return_items.Keys; }
}publicboolRemove(TKey key)
{
Assertor.AreTrue(IsReadOnly,"集合为只读");return_items.Remove(key);
}publicboolTryGetValue(TKey key,outTValue value)
{returnTryGetValue(key,outvalue);
}publicICollection<TValue>Values
{get{return_items.Values; }
}publicTValuethis[TKey key]
{get{
TValue value;if(_items.TryGetValue(key,outvalue))
{returnvalue;
}returnReturnValue(key);
}set{
Assertor.AreTrue(IsReadOnly,"集合为只读");
_items[key]=value;
}
}publicvoidAdd(KeyValuePair<TKey, TValue>item)
{this[item.Key] =item.Value;
}publicvoidClear()
{
Assertor.AreTrue(IsReadOnly,"集合为只读");
_items.Clear();
}publicboolContains(KeyValuePair<TKey, TValue>item)
{return_items.Contains(item);
}publicvoidCopyTo(KeyValuePair<TKey, TValue>[] array,intarrayIndex)
{
((IDictionary<TKey, TValue>)_items).CopyTo(array, arrayIndex);
}publicintCount
{get{return_items.Count; }
}publicboolIsReadOnly {get;privateset; }publicboolRemove(KeyValuePair<TKey, TValue>item)
{returnRemove(item.Key);
}publicIEnumerator<KeyValuePair<TKey, TValue>>GetEnumerator()
{return_items.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{return_items.GetEnumerator();
}
}
View Code
调用staticvoidMain(string[] args)
{//key不存在返回默认值 ,key不区分大小写 (构造函数重载可以设定内部集合,是否只读)vardict =newDictionaryEx<string,string>("default", StringComparer.OrdinalIgnoreCase);
dict.Add("AAA","aaa");
Console.WriteLine(dict["aAa"]);//aaaConsole.WriteLine(dict["Bbb"]);//default//key不存在,执行委托,返回value,并加入集合 , 集合本身为只读 (构造函数重载可以设定内部集合,key比较方式)dict =newDictionaryEx<string,string>(key =>"["+ key +"]",true);
Console.WriteLine(dict["Bbb"]);//[Bbb]try{
dict["Bbb"] ="newvalue";//throw new NotSupportedException("集合为只读");}catch(Exception) { }//创建只读键值对集合varinnerDict =newDictionary<string,string>();
dict=newDictionaryEx<string,string>(innerDict);
innerDict.Add("aaa","aaa");
Console.WriteLine(dict["aaa"]);try{
dict["Bbb"] ="newvalue";//throw new NotSupportedException("集合为只读");}catch(Exception) { }try{
Console.WriteLine(dict["bbb"]);//throw new KeyNotFoundException();}catch(Exception) { }
}
Code CSDNhttps://code.csdn.net/snippets/389634