admin - 2008-6-12 14:34:00
雏形你想构建一个集合类用于存储数据,它里面的值是成对出现的,每一对值都包含“键”和“值”两个部分。键和值里存放的数据类型是不确定的,最好什么类型放到里面都适用。想起了什么?就是它!泛型!真是太伟大了!íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi接下来要考虑的问题是采用什么样的方式来存储这些值,你觉得自己的数据结构学得还比较好,决定要控制一切。在所有集合类型中,数组的速度是最快的,而且它使用方便并且是类型安全的,唯一的缺点就是容量固定。好!不管那么多了,用的就是它。先把代码写出来再说。íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰipublic class ReversibleSortedList<TKey, TValue>íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private TKey[] keys; //键数组íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private TValue[] values; //值数组íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi总算迈出了第一步,确定了大的方向。但是数组是容量固定的,如何能让它的容量可以随着元素的增长而自动增长呢?即然要控制容量,那就要有一个容量属性,用于读取和设置容量。先从读取开始,容量值就是数组keys
或values
的长度。好,继续添加代码:íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰipublic class ReversibleSortedList<TKey, TValue>íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private TKey[] keys; //键数组íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private TValue[] values; //值数组íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰipublic int Capacity //容量属性íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
getíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
return this.keys.Length;íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi现在问题来了,当ReversibleSortedList
被实例化后直接读取Capacity
属性,将会调用keys.Length
属性来返回。但此时keys
并没有被初始化,肯定不能访问其Length
属性。可不可以在声明的同时把它初始化为元素个数为0
的数组呢?íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiprivate TKey[] keys = new TKey[0]; //键数组íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi这样做是没有什么问题,但它刚声明就成为了垃圾,什么都放不了,总让人感觉不舒服。那可不可以让数组初始化为一个固定容量呢?íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiprivate TKey[] keys = new TKey[4]; //键数组íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi但你是一个完美主义者,不希望这样就使用了4
个位置的空间,你更希望在添加元素时才会有空间的拓展。可不可以声明两个静态的,初始长度为0
的数组做为其初始状态呢?这样不管类有多少个实例,进行初始化时使用的都是它们。这样即避免了空间的浪费,也不再需要多次初始化0
长度数组。íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private static TKey[] emptyKeys; //用于键数组的初始化íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private static TValue[] emptyValues; //用于值数组的初始化íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi可以在静态构造器(又称类型构造器)里把它们初始化为长度为0
的数组,并在无参实例构造器中把这两个初始值赋给keys
和values
数组。íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi为了测试自己的想法,需要添加Main()
方法进行测试,下列代码可以直接拷贝并运行,如果不知道如何运行,请参考:íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰihttp://www.enet.com.cn/eschool/video/c/1.shtml íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰiReversibleSortedList 0.1版本:对ReversibleSortedList类的容量进行初始化íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
using System;íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
using System.Collections;íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
using System.Collections.Generic;íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
public class ReversibleSortedList<TKey, TValue>íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
#region 成员变量íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private TKey[] keys; //键数组íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private TValue[] values; //值数组íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private static TKey[] emptyKeys; //用于键数组的初始化íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
private static TValue[] emptyValues; //用于值数组的初始化íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
#endregioníS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
#region 构造方法íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
//类型构造器íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
static ReversibleSortedList()íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
ReversibleSortedList<TKey, TValue>.emptyKeys = new TKey[0];íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
ReversibleSortedList<TKey, TValue>.emptyValues = new TValue[0];íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
public ReversibleSortedList()íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
this.keys = ReversibleSortedList<TKey, TValue>.emptyKeys;íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
this.values = ReversibleSortedList<TKey, TValue>.emptyValues;íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
#endregioníS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
#region 公有属性íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
public int Capacity //容量属性íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
getíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
return this.keys.Length;íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
#endregioníS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
public class TestíS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
static void Main()íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
{íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
ReversibleSortedList<int, string> rs=new ReversibleSortedList<int, string>();íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
Console.WriteLine(rs.Capacity);íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
}íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
运行结果:íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
0íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi
íS
¾
£Hª;www.netcsharp.cnÅÑà×AŰi