.NET中的字典是用来存储多组”键和值”的容器,其中键必须有值且不能重复,值没有任何要求。
但是很多时候我们需要一种保存类似”键和键”的字典,比如字典中的一组对应a-b,从a键可以得到值b,同时也可以从b键得到值a。字典中的两组数据既都是值,也是键,因此必须都有值且不能重复,我们把这组值称为键1和键2,他们都可以通过一面而找到另一面。
这样的话,添加操作需要确保键1和键2不能已经存在,编辑操作也需要注意被修改键值的新值的唯一性,比如这种字典中1的对应值是a,现在要想把1-a改成1-b,那么必须确保b在键2中不存在,因为如果继续将1-a被改成1-b,从另一面会出现两个键都是b的非法情况。
这个类的名称是KeyDictionary,它具有如下特点:
- 仍然采用泛型:KeyDictionary<TKey1, TKey2>,其中TKey1和TKey2分别代表键1和键2的类型
- 继承IEnumerable<KeyValuePair<TKey1, TKey2>>,很显然这种类型的字典不适合继承IDictionary或ICollection
- 继承IClonable,支持元素的浅层拷贝(如果元素是值类型,当然就是深层拷贝)
- 支持自定义IEquatableComparer<TKey1>和IEquatableComparer<TKey2>
- 虽然没有继承IDictionary,但是提供所有字典的典型操作函数,而且是基于两个键的
取值:GetValueFromKey和GetPairFromKey
分别有GetValueFromKey1或2,GetPairFromKey1或2 四个函数。参数是键1或键2。
GetValue返回对应的键值,如果没有的话抛出异常。
GetPair返回一组键,类型是Nullable<KeyValuePair>,如果没有的话返回null。
查询:ContainsKey和ContainsPair
分别有ContainsKey1或2,和ContainsPair 3个函数
ContainsKey不用解释了吧,返回字典中有没有键1或键2.
ContainsPair比较有意思,它是一个更高级的ContainsKey执行。它的参数是两个键(键1和键2),它返回一个Tuple<bool, bool, bool>,即3个布尔值。前两个表示字典里有没有键1和键2,第三个表示键1和键2是不是对应的一对键值,所以只有前两个都为true时,第三个才有可能是true。
添加和修改:Add和EditKey
分别对应Add,EditKey1或2 3个函数。
Add不需要多说,两个键都不能已存在,否则异常抛出。
EditKey在文章开头讲“编辑”的时候也提到过,必须保证新的键值也不能已存在,否则一场抛出。
删除:Remove和Clear
包括RemoveFromKey1或2,Clear 3个函数。
可以通过键1或键2来删除一组键值,或者Clear直接清空容器。
个数:容量和大小
在构造函数里可以指定容器的初始容量(Capacity)。同时可以通过Count来得到容器的实际大小。
(这个属于最基本的容器属性,就不用举代码示例了)
枚举:GetEnumerator和Keys
KeyDictionary继承IEnumerable<KeyValuePair<TKey1, Tkey2>>,因此用foreach可以枚举其键值元素。
IDictionary里有Keys和Values属性,很显然,对于KeyDictionary来说,两个对应的数据都是Key也从另一面都是Value,因此KeyDictionary用Keys1和Keys2来返回两组键的集合。
元素拷贝
你可以使用Clone方法(继承与IClonable)或者使用构造函数,都可以将一个KeyDictionary的内容拷贝到另一个KeyDictionary内。
自定义IEquatableComparer
就像普通字典构造函数的IEquatableComparer,只不过KeyDictionary用两个IEquatableComparer来代表两个键。
源码下载:
点击下载
分享到:
相关推荐
asp.net c# 电子商务网站asp.net c# 电子商务网站
c#c#.net论文c#.net论文c#.net论文c#.net论文c#.net论文c#.net论文c#.net论文
.net c#动态创建程序集、类、属性、方法等 参考文章 http://hi.baidu.com/live36524/blog/item/5cbba22b4716cb87033bf6b3.html
asp.net c# 在类中使用session的方法
基于ASP.NET C#的全源码完整OA,包括人事管理、用户权限管理、信息发布、用车管理等内容。
C#移动开发应用实战 使用Mono for Android和.NET C# 中文版
管理系统 mvc asp.net c# demo 示例 代码
asp.net C# 利用FTP 远程下载文件到指定盘符`
vb.net c#.net win32 API 查询工具自己写的 欢迎使用 并希望提一下建议
asp.net C# 网站 项目 我们老师写的,,很不错!为大家提供一个平台!!!
asp.net C# PDF阅读器源码,asp.net C# PDF阅读器源码
.NET C#去壳反混淆工具 de4dot最新版,能反混淆大部分
.net c#完整培训视频 无密码,传旨最新
C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#.net屏保设计C#...
MyBatis.Net C# 完整项目
一个用于学习Asp.NET C#编程的简单三层架构新闻发布系统,此源码是我学习三层架构时做的一个新闻发布系统,供学习三层的朋友们参考。 源码中涉及用到的技术: C#,Sql Server2005存储过程,触发器,Div+Css,jQuery, ...
.net C# Cron表达式解析..可以解析Cron表达式,有例子也有实现,希望能帮助到需要的人,
wap源码 .net C# wap源码 .net C# wap源码 .net C# wap源码 .net C#
C#开发教程C#开发教程C#开发教程 asp.net C# asp.net C#asp.net C#
搜集整理的ASP.NET C#开发函数库,数据库操作,字符串操作,数据验证,上传等等,不包含没有分页,可以使用aspnextpager控件