您的位置:首页 > 产品设计 > UI/UE

构建可反转排序的泛型字典类(6)--实现IDictionary接口中的Keys和Values属性

2008-02-17 10:33 363 查看

6. 实现IDictionary接口中的Keys和Values属性

现在我们可以着眼于IDictionary接口的实现。第4节中,专门针对这个接口做了一个最简化的例子,我们来回顾一下,它是怎么实现IDictionary接口中的Keys和Values属性的。

public ICollection Keys

public ICollection Values

可以很清楚地看到,它把数组里的所有元素拷贝到另一块内存空间中并返回,这再一次带来了性能问题,如果频繁地访问Keys和Values属性还会给垃圾回收带来压力。最好的解决办法当然是直接引用而不是拷贝数组里的元素,你还希望增加一些功能,可以使用索引访问Keys属性或Values属性所返回的ICollection。但从第5节中的图2(最好直接下载下来以方便观看)中可以看到ICollection接口只有寥寥几个成员,并没有Item属性,怎么办呢?当然是从ICollection的子接口中寻找合适的接口了。我们知道,ICollection接口是集合接口的基接口,而它的子接口则是更专用的集合接口,如IDictionary表示带有键\值对的集合,IList表示值的集合,它们都可以按索引访问。

所以这一次你决定另外实现公有的Keys和Values属性,并返回一个ILst<T>接口,并手动实现它,一方面满足所有的功能,另一方面也可以实现IDictionary和IDictionary<TKey, TValue>接口的Keys和Values属性。好,先来看看ILst<T>接口的关系图:

同理,Values属性枚举时所需要的枚举器代码类似:

枚举器实现了,接下来实现Keys所需要的IList<T>。注意,这里通过弹出异常屏蔽了所有企图对元素进行修改的操作。

同理,Values所需要的Llist<T>代码相似:

上面两个IList<T>接口代码调用了外部类的一些方法,需要把它们添加到ReversibleSortedList类中:

公有方法如下:

//查找指定键索引

public int IndexOfKey(TKey key)

//查找指定值索引

public int IndexOfValue(TValue value)

//判断是否包含指定键

public bool ContainsKey(TKey key)

//判断是否包含指定值

public bool ContainsValue(TValue value)

私有方法如下:

private TValue GetByIndex(int index)

//返回指定索引的键

private TKey GetKey(int index)

private void Insert(int index, TKey key, TValue value)

private KeyList<TKey, TValue> GetKeyListHelper()

private ValueList<TKey, TValue> GetValueListHelper()

写了这么多代码,终于可以实现Keys和Values属性了。

首先添加这两个属性所需的成员变量:

private KeyList<TKey, TValue> keyList;

private ValueList<TKey, TValue> valueList;

然后实现Keys和Values属性,以上这么多代码,就是为了这两个属性:

public IList<TKey> Keys

public IList<TValue> Values

看到这,你是不是有些不耐烦了,反正我是有这样的感觉了。但有一点你必须明白,FCL里的代码就是这么实现的。

好,做了这么多工作,终于可以看看成果,测试一下是否可用了。在Main方法添加如下代码:

static void Main()

上帝啊!太痛苦了,如果你也有这样的感觉,请下载现成的代码,更改Main()方法里的东西,尝试是否能通过Keys和Values属性更改元素。

ReversibleSortedList 0.5版本:实现Keys和Values属性

完整代码下载

运行结果:

1 b

2 c

3 a

4 f

5 e

6 d

1 2 3 4 5 6

b c a f e d

4

e
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: