代码

    public class DictionaryEx<TKey, TValue> : IDictionary<TKey, TValue>
{
/// <summary> 用户存储数据的字典
/// </summary>
private IDictionary<TKey, TValue> _items;
/// <summary> 默认值
/// </summary>
private TValue _defaultValue;
/// <summary> 用于获取值的委托
/// </summary>
private Converter<TKey, TValue> _getValue;
/// <summary> 1返回_defaultValue, 2执行_getValue, 0抛出异常
/// </summary>
private int _mode = ; #region 构造函数
/// <summary> 初始化 DictionaryEx , key不存在时返回defaultValue
/// </summary>
/// <param name="defaultValue">默认值</param>
public DictionaryEx(TValue defaultValue)
{
_items = new Dictionary<TKey, TValue>();
_defaultValue = defaultValue;
_mode = ;
} /// <summary> 初始化 DictionaryEx , key不存在时返回defaultValue
/// </summary>
/// <param name="defaultValue">默认值</param>
/// <param name="comparer">比较键时要使用对象,如果为null则使用默认比较方法</param>
public DictionaryEx(TValue defaultValue, IEqualityComparer<TKey> comparer)
{
_items = new Dictionary<TKey, TValue>(comparer);
_defaultValue = defaultValue;
_mode = ;
} /// <summary> 初始化 DictionaryEx 只读集合, key不存在时返回defaultValue
/// </summary>
/// <param name="defaultValue">默认值</param>
/// <param name="dictionary">内部字典</param>
public DictionaryEx(TValue defaultValue, IDictionary<TKey, TValue> dictionary)
{
Assertor.AreNull(dictionary, "dictionary");
_items = dictionary;
IsReadOnly = true;
_defaultValue = defaultValue;
_mode = ;
} /// <summary> 初始化 DictionaryEx, key不存在时返回defaultValue
/// </summary>
/// <param name="defaultValue">默认值</param>
/// <param name="dictionary">内部字典</param>
/// <param name="isReadOnly">是否只读</param>
public DictionaryEx(TValue defaultValue, IDictionary<TKey, TValue> dictionary, bool isReadOnly)
{
Assertor.AreNull(dictionary, "dictionary");
_items = dictionary;
IsReadOnly = isReadOnly;
_defaultValue = defaultValue;
_mode = ;
} /// <summary> 初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合
/// </summary>
/// <param name="getValue">获取值的委托</param>
public DictionaryEx(Converter<TKey, TValue> getValue)
{
Assertor.AreNull(getValue, "getValue");
_items = new Dictionary<TKey, TValue>();
_getValue = getValue;
_mode = ;
} /// <summary> 初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合
/// </summary>
/// <param name="getValue">获取值的委托</param>
/// <param name="comparer">比较键时要使用对象,如果为null则使用默认比较方法</param>
public DictionaryEx(Converter<TKey, TValue> getValue, IEqualityComparer<TKey> comparer)
{
Assertor.AreNull(getValue, "getValue");
_items = new Dictionary<TKey, TValue>(comparer);
_getValue = getValue;
_mode = ;
} /// <summary> 初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合
/// </summary>
/// <param name="getValue">获取值的委托</param>
/// <param name="isReadOnly">集合是否限制外部修改</param>
public DictionaryEx(Converter<TKey, TValue> getValue, bool isReadOnly)
{
Assertor.AreNull(getValue, "getValue");
_items = new Dictionary<TKey, TValue>();
_getValue = getValue;
IsReadOnly = isReadOnly;
_mode = ;
} /// <summary> 初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合
/// </summary>
/// <param name="getValue">获取值的委托</param>
/// <param name="comparer">比较键时要使用对象</param>
/// <param name="isReadOnly">集合是否限制外部修改</param>
public DictionaryEx(Converter<TKey, TValue> getValue, IEqualityComparer<TKey> comparer, bool isReadOnly)
{
Assertor.AreNull(getValue, "getValue");
_items = new Dictionary<TKey, TValue>(comparer);
_getValue = getValue;
IsReadOnly = isReadOnly;
_mode = ;
} /// <summary> 初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合
/// </summary>
/// <param name="getValue">获取值的委托</param>
/// <param name="dictionary">内部字典</param>
public DictionaryEx(Converter<TKey, TValue> getValue, IDictionary<TKey, TValue> dictionary)
{
Assertor.AreNull(getValue, "getValue");
Assertor.AreNull(dictionary, "dictionary");
_items = dictionary;
_getValue = getValue;
IsReadOnly = true;
_mode = ;
} /// <summary> 初始化 DictionaryEx 设定getValue委托,key不存在时执行委托,并加入集合
/// </summary>
/// <param name="getValue">获取值的委托</param>
/// <param name="dictionary">内部字典</param>
/// <param name="isReadOnly">是否只读</param>
public DictionaryEx(Converter<TKey, TValue> getValue, IDictionary<TKey, TValue> dictionary, bool isReadOnly)
{
_items = dictionary;
_getValue = getValue;
IsReadOnly = isReadOnly;
_mode = ;
} /// <summary> 初始化 DictionaryEx 只读集合
/// </summary>
/// <param name="dictionary">内部字典</param>
public DictionaryEx(IDictionary<TKey, TValue> dictionary)
{
Assertor.AreNull(dictionary, "dictionary");
IsReadOnly = true;
_items = dictionary;
_mode = ;
}
#endregion private TValue ReturnValue(TKey key)
{
switch (_mode)
{
case :
return _defaultValue;
case :
var value = _getValue(key);
lock (this)
{
_items[key] = value;
}
return value;
default:
throw new KeyNotFoundException();
}
} public void Add(TKey key, TValue value)
{
this[key] = value;
} public bool ContainsKey(TKey key)
{
return _items.ContainsKey(key);
} public ICollection<TKey> Keys
{
get { return _items.Keys; }
} public bool Remove(TKey key)
{
Assertor.AreTrue(IsReadOnly, "集合为只读");
return _items.Remove(key);
} public bool TryGetValue(TKey key, out TValue value)
{
return TryGetValue(key, out value);
} public ICollection<TValue> Values
{
get { return _items.Values; }
} public TValue this[TKey key]
{
get
{
TValue value;
if (_items.TryGetValue(key, out value))
{
return value;
}
return ReturnValue(key);
}
set
{
Assertor.AreTrue(IsReadOnly, "集合为只读");
_items[key] = value;
}
} public void Add(KeyValuePair<TKey, TValue> item)
{
this[item.Key] = item.Value;
} public void Clear()
{
Assertor.AreTrue(IsReadOnly, "集合为只读");
_items.Clear();
} public bool Contains(KeyValuePair<TKey, TValue> item)
{
return _items.Contains(item);
} public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
((IDictionary<TKey, TValue>)_items).CopyTo(array, arrayIndex);
} public int Count
{
get { return _items.Count; }
} public bool IsReadOnly { get; private set; } public bool Remove(KeyValuePair<TKey, TValue> item)
{
return Remove(item.Key);
} public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return _items.GetEnumerator();
} System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return _items.GetEnumerator();
}
}

调用

        static void Main(string[] args)
{
//key不存在返回默认值 ,key不区分大小写 (构造函数重载可以设定内部集合,是否只读)
var dict = new DictionaryEx<string, string>("default", StringComparer.OrdinalIgnoreCase);
dict.Add("AAA", "aaa");
Console.WriteLine(dict["aAa"]); //aaa
Console.WriteLine(dict["Bbb"]); //default //key不存在,执行委托,返回value,并加入集合 , 集合本身为只读 (构造函数重载可以设定内部集合,key比较方式)
dict = new DictionaryEx<string, string>(key => "[" + key + "]", true);
Console.WriteLine(dict["Bbb"]); //[Bbb]
try
{
dict["Bbb"] = "newvalue"; //throw new NotSupportedException("集合为只读");
}
catch (Exception) { } //创建只读键值对集合
var innerDict = new Dictionary<string, string>();
dict = new DictionaryEx<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 CSDN

https://code.csdn.net/snippets/389634

增强版字典DictionaryEx的更多相关文章

  1. pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明

    初学时大多使用print或log调试程序,这在小规模的程序下很方便 但是更好的方法是一边运行一边检查里面的变量和方法 1.Pdb Pdb是一个交互式的调试工具,集成于Python标准库中 Pdb能让你 ...

  2. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

  3. 最新GHOST XP系统下载旗舰增强版 V2016年

    系统来自:系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年3月 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插 ...

  4. 最新深度技术GHOST XP系统旗舰增强版 V2016年

    来自系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插件,增强浏 ...

  5. WinNTSetup v3.8.7 正式版绿色增强版

    最强系统安装利器:WinNTSetup 现已更新至 v3.8.7 正式版!这次更新修复调整了诸多问题,新版非常好用接近完美!WinNTSetup 现在已经自带BCDBoot 选项,并且完全支持Wind ...

  6. 将表里的数据批量生成INSERT语句的存储过程 继续增强版

    文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...

  7. CentOS6.5安装Tab增强版:bash-completion

    CentOS6.5安装Tab增强版:bash-completion,可补全命令参数: 因为CentOS官方源并不带有bash-completion的包,所以,为了可用yum安装,增加epel的源, 首 ...

  8. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  9. zw版_zw中文增强版Halcon官方Delphi例程

    [<zw版·delphi与halcon系列原创教程>zw版_zw中文增强版Halcon官方Delphi例程 源码下载:http://files.cnblogs.com/files/ziwa ...

随机推荐

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. mybatis_基础篇

    一.认识mybatis: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...

  3. H5程序员如何利用cordova开发跨平台应用

    什么是Cordova? Cordova以前也叫PhoneGap,它提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.Cordova还 ...

  4. Mac上MySQL忘记root密码且没有权限的处理办法&workbench的一些tips (转)

    忘记Root密码肿么办 Mac上安装MySQL就不多说了,去mysql的官网上下载最新的mysql包以及workbench,先安装哪个影响都不大.如果你是第一次安装,在mysql安装完成之后,会弹出来 ...

  5. 根据ip判断返回城市名称查询当地天气

    <?phpheader("content-type:text/html;charset=utf-8");date_default_timezone_set("Asi ...

  6. RabbitMQ + PHP (三)案例演示

    今天用一个简单的案例来实现 RabbitMQ + PHP 这个消息队列的运行机制. 主要分为两个部分: 第一:发送者(publisher) 第二:消费者(consumer) (一)生产者 (创建一个r ...

  7. 基于Vue2.0的单页面开发方案

    2016的最后一天,多多少少都应该总结一下这一年的得失,哪里做的好,哪里需要改进,记一笔,或许将来会用到呢. 毕业差不多半年了,一直是一个人在负责公司项目的前端开发与维护,当时公司希望前后端分离,提高 ...

  8. 中国CIO最关心的八大问题(下)

    中国CIO最关心的八大问题(下) 从调研数据还可以看出,在企业级IT建设与投资上,CIO们并非是一群狂热的技术信徒,他们更多的是从企业发展阶段.信息化程度.技术成熟度.ROI等方面进行综合评估. 五. ...

  9. iOS 自定义方法 - 不完整边框

    示例代码 ///////////////////////////OC.h////////////////////////// ////  UIView+FreeBorder.h//  BHBFreeB ...

  10. NSURLSession详解

    导语 现在NSURLConnection在开发中会使用的越来越少,iOS9已经将NSURLConnection废弃,现在最低版本一般适配iOS7,所以也可以使用. NSURLConnection相对于 ...