
5.4 自定义集合类
在System.Collections命名空间下,有两个并不常用的集合CollectionBase和DictionaryBase,这两个集合通常被用来作为自定义集合的基类。
内置的集合并不能满足所有的数据集合处理,C#为用户自定义集合提供了条件。本节介绍自定义集合类。
5.4.1 自定义集合类概述
自定义集合类通常使用CollectionBase和DictionaryBase类作为基类,对这两个基类解释如下。
(1)CollectionBase:为强类型集合提供abstract基类。
(2)DictionaryBase:为键/值对的强类型集合提供abstract基类。
集合类有键/值对的字典集合和一般的集合,这两个基类一个作为非字典集合的基类,一个作为字典集合的基类。
以一般的集合类创建为例,首先要了解基类CollectionBase的成员,以便利用基类和重写基类。CollectionBase类的属性如表5-16所示,CollectionBase类的方法如表5-17所示。
表5-16 CollectionBase类的属性

表5-17 CollectionBase类的方法

5.4.2 实验指导——家电信息管理
本节自定义集合类,处理家电信息。首先创建家电信息类,接着自定义集合类实现数据的添加、删除和查询,继承CollectionBase并重写基类的方法,步骤如下。
(1)创建家电信息类appliances,有字段aname表示家电名称,字段aprice表示家电价格,并对应有两个属性。appliances类有两个构造函数,一个是没有参数的,一个是有着两个参数分别对两个字段进行初始化的,代码如下。
public class appliances { public string aname; public double aprice; public appliances(){ } public appliances(string name, double price) { aname = name; aprice = price; } public string anames { get { return aname; } set { aname = value; } } public double aprices { get { return aprice; } set { aprice = value; } } }
(2)接下来创建集合类applianceslist,实现最基本的元素添加、元素查询和删除,继承基类CollectionBase并重写基类的方法。使用代码如下。
public class applianceslist : CollectionBase { public virtual int Add(appliances app) //重写父类的添加方法 { return InnerList.Add(app); } public new void RemoveAt(int index) //父类中该方法不允许覆盖,使用new关键字重写 { InnerList.RemoveAt(index); } public appliances GetItem(int index) //根据索引获得类对象 { return (appliances)List[index]; } }
(3)最后是上述两个类的实现,对家电信息类初始化4个示例,将这4个数据向集合中添加并输出集合中的数据;删除集合中索引为1的数据并输出集合中的现有数据,代码如下。
appliances app1 = new appliances("热水器", 597); appliances app2 = new appliances("冰箱", 2345); appliances app3 = new appliances("电视", 1564); appliances app4 = new appliances("洗衣机", 998); applianceslist applist = new applianceslist(); applist.Add(app1); applist.Add(app2); applist.Add(app3); applist.Add(app4); Console.WriteLine("*****************元素添加后:"); for (int i = 0; i < applist.Count; i++) { Console.WriteLine("名称:{0} 价格:{1}", applist.GetItem(i).aname, applist.GetItem(i).aprice); } Console.WriteLine("*****************删除索引为1的元素:"); applist.RemoveAt(1); for (int i = 0; i < applist.Count; i++) { Console.WriteLine("名称:{0} 价格:{1}", applist.GetItem(i).aname, applist.GetItem(i).aprice); }
上述代码的执行结果如图5-3所示。

图5-3 家电信息管理