4.7 灵活自由的集合
知识点讲解:光盘:视频\PPT讲解(知识点)\第4章\灵活自由的集合.mp4
在C#程序中,数组不能实现动态数据处理。为了解决这种限制,推出了集合这一概念。通过集合可以把相互联系的数据组合到一个集合内,这样就能够有效地处理这些密切相关的数据。在C#中,能够使用相同的代码来处理一个集合内的所有元素,而不需要编写不同的代码来处理单个独立对象。
4.7.1 C#集合概述
在C#中,数组通过System.Array类实现,它只是集合类的一种。集合类通常被用于处理对象列表,其功能比数组强大。集合类的处理功能是通过System.Collections命名空间中的接口实现的,所以集合的语法是符合标准化的。
集合的功能通常使用接口来实现,这个接口不仅没有限制使用的基本集合类,而且还可以创建一个自定义的集合类。这样从集合内提取数据时,就不需要把它们特意转换为专用的类型了。
在System.Collections命名空间中,可以通过如下接口提供基本集合功能。
- IEnumerable:用于迭代集合项。
- ICollection:用于获取集合项的个数,并把项复制到一个简单的数组类型中。
- IList:提供了集合项列表,并访问这些项,以及一些与项列表相关的功能。
- IDictionary:和IList类似,但是它能够通过键码值访问项列表。
其中,System.Collections. ICollection是所有集合的基接口,语法格式如下。
public interface ICollection : IEnumerable
{
}
因为System.Collections. Icollection直接继承了System.Collections. IEnumerable,而没有添加任何的成员,所以它完全等价于System.Collections. IEnumerable接口,即所有的集合类都必须实现System.Collections. IEnumerable接口。类实现了这个接口后,就能依次列举集合类内所包含的数据元素。IEnumerable接口的定义格式如下。
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
IEnumerable接口只包含一个方法GetEnumerator,它返回一个能够访问集合中数组的列举器对象。列举器必须实现System.Collections. IEnumerator接口。Ienumerator接口的定义格式如下。
public interface IEnumerator
{
Boolean MoveNext();
Object Current
{
get;
}
void Reset();
}
1.列举器
列举器的功能是读取集合中的数据,即循环访问集合的对象。但是列举器不能修改基础集合,实现IEnumerator接口的类必须实现函数Reset和MoveNext以及属性Current。
当创建集合对象后,列举器应定位在集合中的第一个元素之前。函数Reset将列举器返回到此位置,但此时调用Current属性会发生异常。所以在读取Current前必须调用函数MoveNext,将列举器定位在集合的第一个元素。
一个列举器只能与一个集合关联,但一个集合可以有多个列举器关联。在C#中,列举器通常与foreach语句配合使用,因此隐藏了操作列举器的复杂性。
2.容量和计数
集合容量即集合所包含的元素数量,而集合计数是它实际包含的元素数目。System.Collections命名空间中的集合在达到当前容量(在定义不同类型时,拥有不同的容量)时会自动扩充容量。
3.下限
集合的下限是它第一个元素的索引,System.Collections命名空间中的集合的下限都是0。
4.7.2 使用集合
在System.Collections命名空间中,提供了接口IList、ICollection和Ienumerable来实现集合功能。但是,它们只提供了某些功能需要执行的代码,例如函数Clear和RemoveAt。如果要实现特定的功能,则需要执行其他的指定代码。或者使用System.Collections. CollectionBase类,它提供了许多集合类的实现方式。例如,对象mm的集合类可以使用如下代码定义。
public class Animals : CollectionBase
{
public void Add(Animal newAnimal)
{
List.Add(newAnimal);
}
public void Remove(Animal newAnimal)
{
List.Remove(newAnimal);
}
public Animals()
{
}
在上述代码中,函数Add和Remove实现了强类型转换,List接口用于访问项的标准Add函数。Add函数只能处理mm类或它派生的类。同样在System.Collections.CollectionBase的派生类中,可以使用foerach函数读取集合内的数据。例如下面的一段代码。
static void Main(string[] args)
{
mm AA = new mm();
AA.Add(new Cow("Jack"));
AA.Add(new Chicken("Vera"));
foreach (mm myAnimal in AA)
{
myAnimal.Feed();
}
Console.ReadKey();
}
共有条评论 网友评论