集合:可以使用集合来维护对象组。与数组不同,集合可以控制对集合内的对象进行访问、搜索和排序功能。本文主要介绍如何使用和创建集合类。
C#中的数组实现为System.Array 类的实例,它们只是集合类(Collection Classes)中的一种类型。集合的功能(包括基本功能)可以通过接口来实现,该接口不仅没有限制我们使用基本集合类,例如System.Array,相反,我们还可以创建自己的定制集合类。
System.Collections 名称空间中的几个接口提供了基本的组合功能:
IEnumerable 可以迭代集合中的项。
ICollection(继承于IEnumerable)可以获取集合中项的个数,并能把项复制到一个简单的数组类型中。
IList(继承于IEnumerable 和ICollection)提供了集合的项列表,允许访问这些项,并提供其他一些与项列表相关的基本功能。
IDictionary(继承于IEnumerable 和ICollection)类似于IList,但提供了可通过键值(而不是索引)访问的项列表。
一.使用集合
ArrayList animalArrayList = new ArrayList(); //创建arraylist集合
///以下代码用于初始化集合中的成员
Cow myCow2 = new Cow("Hayley");
animalArrayList.Add(myCow2);
animalArrayList.Add(new Chicken("Roy"));
写出每个animal对象的信息
foreach (Animal myAnimal in animalArrayList)
{
Console.WriteLine("New {0} object added to ArrayList collection, " +
"Name = {1}", myAnimal.ToString(), myAnimal.Name);
}
Console.WriteLine("ArrayList collection contains {0} objects.", animalArrayList.Length);///获取集合长度
简单数组是强类型化的,可以直接访问它们所包含的项类型。所以您可以直接调用项的方法:
animalArray[0].Feed();
数组的类型是抽象类型Animal,因此不能直接调用由派生类提供的方法,而必须使用数据类型转换:
((Chicken)animalArray[1]).LayEgg();
以下为arrayliat特有的:
使用Remove()和RemoveAt()方法删除项
animalArrayList.RemoveAt(0);
animalArrayList.Remove(myCow2);
删除索引为0的项,会使其他项在数组中移动一个位置,所以应使用索引0(而非1)来访问Chicken 对象,不再有索引为1的项了。
AddRange()方法不是ArrayList 提供的任何接口的一部分,这个方法专用于ArrayList 类。它可以给集合添加一个数组。
animalArrayList.AddRange(animalArray);///将一个数组添加到集合中
二.定义集合类
我们可以从一个类中派生自己的集合,例如System.Collections.CollectionBase 类,这个抽象类提供了集合类的许多实现
方式。这是推荐使用的方式。
CollectionBase 类有接口IEnumerable、ICollection 和IList,但只提供了一些简要的实现代码,特别是IList 的Clear()和RemoveAt()方法,以及ICollection 的Count 属性。如果要使用提供的功能,就需要自己执行其他代码。
public class Animals : CollectionBase///强类型集合:从CollectionBase类中派生出集合类Animals
{
public void Add(Animal newAnimal) ///添加Animal类成员的方法
{
List.Add(newAnimal); //调用List的添加方法
}
public void Remove(Animal newAnimal) ///移除Animal类成员的方法
{
List.Remove(newAnimal);
}
public Animals()
{
}
public Animal this[int animalIndex] 这个animalIndex是集合的索引符,等价于数组的下标
{
get ///读访问器
{
return (Animal)List[animalIndex];
}
set ///写访问器
{
List[animalIndex] = value;
}
}
}
三.索引符
索引符(indexer)是一种特殊类型的属性,可以把它添加到一个类中,以提供类似于数组的访问。实际上,可以通过索引符提供更复杂的访问,因为我们可以用方括号语法定义和使用复杂的参数类型。它最常见的一个用法是对项执行简单的数字索引。
上面集合类中定义了Animal索引符。
static void Main( )
{
Animals animalCollection = new Animals(); //实例化了Animals 对象
animalCollection.Add(new Cow("Jack")); //给对象添加元素
animalCollection.Add(new Chicken("Vera")); //Animal是抽象类,只能用派生类才能进行实例化
animalCollection[0].Feed(); ///利用索引符直接调用第一个集合元素的方法
{
myAnimal.Feed();
}
Console.ReadKey();
}