构建可反转排序的泛型字典类(6)--实现IDictionary接口中的Keys和Values属性2010-11-266. 实现IDictionary接口中的Keys和Values属性现在我们可以着眼于IDictionary接口的实现。第4节中,专门针对这个接口做了一 个最简化的例子,我们来回顾一下,它是怎么实现IDictionary接口中的Keys和Values属性的。
public ICollection Keys
{ //返回所有键的集合
get
{ //把所有键的集合拷贝到新数组中并返回
Object[] keys = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
keys[n] = items[n].Key;
return keys;
}
}
public ICollection Values
{ //返回 所有值的集合
get
{ //把所有值的集合拷贝到新数组中并返回
Object[] values = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
values[n] = items [n].Value;
return 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>接口的关系图:

图4 IList<T>接口关系图