构建可反转排序的泛型字典类(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
相关文章推荐
- 构建可反转排序的泛型字典类(7)--实现IDictionary接口
- 构建可反转排序的泛型字典类(8)--实现IDictionary接口
- 构建可反转排序的泛型字典类(4)--IDictionary接口
- 构建可反转排序的泛型字典类(5)--实现IEnumerable>接口
- 构建可反转排序的泛型字典类(3)--实现元素添加及自动扩展
- 构建可反转排序的泛型字典类(9完)--完善
- 构建可反转排序的泛型字典类(1)--雏形
- 构建可反转排序的泛型字典类(2)--排序方向
- 黑马程序员_day15 TreeSet,二叉树,实现Comparator方式排序,泛型,泛型接口,泛型限定)
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口
- 实现泛型接口(排序)
- Java SE TreeSet(实现Comparable接口和Comparator匿名类)根据属性排序示例
- DataGridView使用非泛型或者未实现IBindingList接口泛型集合的列排序问题
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口(转)
- 使用 Comparable 接口实现对象的属性排序
- List<>根据指定属性排序(实现IComparer接口)
- 通用排序函数的功能实现(利用接口和委托实现泛型[通用]排序)
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口
- SortedDictionary构建泛型排序字典
- java中实现HashMap中的按照key的字典顺序排序输出