6. 实现IDictionary接口中Keys和Values属性
现在我们可以着眼于IDictionary接口实现第4节中专门针对这个接口做了个最简化例子我们来回顾下它是如何实现IDictionary接口中Keys和Values属性
public ICollection Keys
{ //返回所有键集合
get
{ //把所有键集合拷贝到新中并返回
Object keys = Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n)
keys[n] = items[n].Key;
keys;
}
}
public ICollection Values
{ //返回所有值集合
get
{ //把所有值集合拷贝到新中并返回
Object values = Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n)
values[n] = items[n].Value;
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>接口关系图:
ReversibleSortedList<, >;
//添加元素
rs.Add(3, "a");
rs.Add(1, "b");
rs.Add(2, "c");
rs.Add(6, "d");
rs.Add(5, "e");
rs.Add(4, "f");
//打印键/值
foreach (KeyValuePair<, > d in rs)
{
Console.WriteLine(d.Key + " " + d.Value);
}
//打印键这里访问了Keys属性
foreach ( i in rs.Keys)
{
Console.Write(i + " ");
}
Console.WriteLine;//换行
//打印值这里访问了Values属性
foreach ( s in rs.Values)
{
Console.Write(s + " ");
}
Console.WriteLine;//换行
Console.WriteLine(rs.Keys[3]); //通过索引访问键
Console.WriteLine(rs.Values[4]); //通过索引访问值
}
上帝啊!太痛苦了如果你也有这样感觉请下载现成代码更改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
最新评论