增强版字典DictionaryEx

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

代码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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航