一个.NET(C#)的双键字典类
.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来代表两个键。
源码下载:点击下载