增强版字典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 = 0;

#region 构造函数
/// <summary> 初始化 DictionaryEx , key不存在时返回defaultValue
/// </summary>
/// <param name="defaultValue">默认值</param>
public DictionaryEx(TValue defaultValue)
{
_items = new Dictionary<TKey, TValue>();
_defaultValue = defaultValue;
_mode = 1;
}

/// <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 = 1;
}

/// <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 = 1;
}

/// <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 = 1;
}

/// <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 = 2;
}

/// <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 = 2;
}

/// <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 = 2;
}

/// <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 = 2;
}

/// <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 = 2;
}

/// <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 = 2;
}

/// <summary> 初始化 DictionaryEx 只读集合
/// </summary>
/// <param name="dictionary">内部字典</param>
public DictionaryEx(IDictionary<TKey, TValue> dictionary)
{
Assertor.AreNull(dictionary, "dictionary");
IsReadOnly = true;
_items = dictionary;
_mode = 0;
}
#endregion

private TValue ReturnValue(TKey key)
{
switch (_mode)
{
case 1:
return _defaultValue;
case 2:
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

时间: 2024-11-29 07:10:38

增强版字典DictionaryEx的相关文章

系统垃圾清理利器CCleaner v5.30.6063绿色单文件版(增强版)

系统垃圾清理利器CCleaner现已更新至v5.30.6063,此次更新为Edge.IE浏览器提供了更好的清理功能,更新了Windows Explorer MRU清理功能,同时改善了应用程序中的SSD检测.5.0版全新Modren UI界面设计,简洁大气!内部框架大优化,性能大提升!支持主动防御及监控! CCleaner是梨子公司Piriform最为著名广受好评的软件,系统垃圾清理工具,免费的系统清理优化和隐私保护工具,也是该公司主打和首发产品!它体积小巧.运行速度极快,具有强大的自定义清理规则

VC709E 增强版 基于FMC接口的Xilinx Vertex-7 FPGA V7 XC7VX690T PCIeX8 接口卡

VC709E 增强版 基于FMC接口的Xilinx Vertex-7 FPGA V7 XC7VX690T PCIeX8 接口卡 一.板卡概述       本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片,支持PCIeX8.64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows. 二.功能和技术指标:     1.标准PCI-E接口,支持PCI-E 8x,支持PCI-E 3.0.    2.标准FMC-HPC接口,VA

办公软件套装 MSDN Office 2016 专业增强版

Microsoft Office 2016 是微软推出的又一代全新的办公自动化软件套装,其开发代号为 Office 16,实际上是第十四个发行版本,目前微软针对该套装在订户下载专区仅提供专业增强版,其将维持用户一直以来熟悉的操作体验,非常适合配备鼠标键盘的电脑使用. Office 2016 延续了 Office 2013 的扁平化用户界面设计,同时也和 Windows 10 有重要的整合,包括 Windows Hello 支持.Cortana 可以通过 Outlook 2016 获取到你的信息和

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

文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧,算作继续增加文章中解决的:根据查询条件自动生成插入脚本的需求,其实这种需求还是蛮常见的. 本文着重解决了文中的脚本的schema问题,给调整了下,现在脚本能自动识别出不同的schema下同名的表的语句 修改后脚本如下: -- Author: <桦仔> -- Blog: <http://ww

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

来自系统妈:http://www.xitongma.com 深度技术GHOST xp系统旗舰增强版 V2016年 系统概述 深度技术ghost xp系统旗舰增强版集合微软JAVA虚拟机IE插件,增强浏览网页时对JAVA程序的支持,添加安装华文行楷.华文新魏.方正姚体.汉真广标等常用字体.以系统稳定为第一制作要点,收集市场常用硬件驱动程序,安装维护方便快速 - 集成常见硬件驱动,智能识别+预解压技术,绝大多数硬件可以快速自动安装相应的驱动.加快“网上邻居”共享速度:取消不需要的网络服务组件,系统支

办公软件套装 Office 2010 With SP1 专业增强版

Microsoft Office 2010 是微软推出的新一代办公自动化软件套装,其开发代号为 Office 14,实质上是第十二个发行版.该软件共有六个版本,它们分别是初级版.家庭及学生版.家庭及商业版.标准版.专业版和专业增强版. 此外,微软还推出了 Office 2010 免费版本,其中仅包括:Word 和 Excel 等常规应用组件. 除了完整版以外,微软还将发布针对 Office 2007 的升级版 Office 2010. Microsoft Office 2010 可支持 32位和

新大陆PT850/PT853 对接 方象2000 增强版

下图为TI C6xx DSP Nyquist总线拓扑图,总线连接了master与slave,提供了高速的数据传输.有很多种速率不同的总线,如图中的红色方框,最高速总线为CPU/2 TeraNet SCR(即VBUSM SCR),带宽为256bit,其他低速总线为CPU/3,CPU/6,带宽参考图中所示.总线之间用Bridge(桥)连接,作用包括转换总线的速率,使之与所流向总线的速率相同等. 在具体应用中,各种速率的总线完全可以满足复杂的数据传输,而数据传输的瓶颈往往在于连接总线之间的Bridge

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-终端源码

[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-终端源码 广东职业技术学院 欧浩源 一.关于硬件电路 关于这个综合实训案例,具体需求详见<[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-题目需求>. 我自己实在"全国职业院校技能大赛--物联网技术应用赛项"的Zigbee模块上实现的.该模块的电路应该和TI公司官方评估板的推荐电路差不多,我想现在市面上很多开发板也是参考这样的电路设计,只要您使用的开发板上有LED灯.按键输入.串口输出和一路A/

office 2016 专业增强版 和 visio 2016 专业版 下载安装(附带激活工

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://babyshen.blog.51cto.com/8405584/1697910 office 2016 专业增强版 和 visio 2016 专业版 下载安装(附带激活工具) 百度云盘下载地址 http://pan.baidu.com/s/1hqo6ZM8 安装的时候卸载以前的旧版office卸载方法:win+R 打开运行,输入appwiz.cpl,打开程序和功能,找到旧版off