增强版字典DictionaryEx
代码
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的更多相关文章
- pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明
初学时大多使用print或log调试程序,这在小规模的程序下很方便 但是更好的方法是一边运行一边检查里面的变量和方法 1.Pdb Pdb是一个交互式的调试工具,集成于Python标准库中 Pdb能让你 ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- 最新GHOST XP系统下载旗舰增强版 V2016年
系统来自:系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年3月 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插 ...
- 最新深度技术GHOST XP系统旗舰增强版 V2016年
来自系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插件,增强浏 ...
- WinNTSetup v3.8.7 正式版绿色增强版
最强系统安装利器:WinNTSetup 现已更新至 v3.8.7 正式版!这次更新修复调整了诸多问题,新版非常好用接近完美!WinNTSetup 现在已经自带BCDBoot 选项,并且完全支持Wind ...
- 将表里的数据批量生成INSERT语句的存储过程 继续增强版
文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...
- CentOS6.5安装Tab增强版:bash-completion
CentOS6.5安装Tab增强版:bash-completion,可补全命令参数: 因为CentOS官方源并不带有bash-completion的包,所以,为了可用yum安装,增加epel的源, 首 ...
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
<zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...
- zw版_zw中文增强版Halcon官方Delphi例程
[<zw版·delphi与halcon系列原创教程>zw版_zw中文增强版Halcon官方Delphi例程 源码下载:http://files.cnblogs.com/files/ziwa ...
随机推荐
- 【初学python】使用python调用monkey测试
目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...
- HTML文档声明
前面的话 HTML文档通常以类型声明开始,该声明将帮助浏览器确定其尝试解析和显示的HTML文档类型.本文将详细介绍文档声明DOCTYPE 特点 文档声明必须是HTML文档的第一行.且顶格显示, ...
- 修改eclipse皮肤
习惯了vim黑色背景的程序猿们想必用eclipse时会倍感的不适应吧,不过没关系,因为eclipse的皮肤是可以自己定制的! 下面是我电脑上的eclipse界面,看到这个是不是找回了vim的感觉呢? ...
- 我大中华微软MVP中国区人才库
刘海峰:国内知名微软开源技术网站51Aspx 创始人,十年以上的Asp.net从业经验,微软MSDN特约讲师.Teched讲师.ImagineCup大赛评委.人大出版社研修班特约讲师,曾多次受邀访问美 ...
- H3 BPM:为石化企业提供一个不一样的全停大修平台
H3 BPM大型炼化企业装置全停检修管理平台(简称"全停大修")结合国际化的流程管理理念.成熟的系统技术架构.优秀的行业解决方案,为石油化工行业全停大修提供了卓越的信息化管理方案, ...
- 利用PowerShell复制SQLServer账户的所有权限
问题 对于DBA或者其他运维人员来说授权一个账户的相同权限给另一个账户是一个很普通的任务.但是随着服务器.数据库.应用.使用人员地增加就变得很枯燥乏味又耗时费力的工作.那么有什么容易的办法来实现这个任 ...
- 札记:Java异常处理
异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...
- embedding mono实战笔录(一)
最近在给自己的服务器节点添加脚本功能,考虑到 执行性能.开发效率.调试效率.可维护性.严谨性 五大要素,最终选用C#作为脚本语言,并使用mono作为中间层,使其具备跨平台特性,以备具有在Windows ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
- linux 下压缩大批量文件
find ./ -name '*衢州*' -type f -print| xargs zip /home/Eyuncloud/qz_20150211.zip