关于C#中集合和数组(一)

时间:2022-06-01 16:48:58

很多同学在学习《使用集合组织相关数据》一章时,出现了很多不理解的地方,动手编码的时候出现很多的错误,现在我将数组与集合的相关的内容总结了一下,希望能给你们的学习带来相应的帮助。

在.NET Framework中提供了很多集合类,如ArrayList、Hashtable、SortedList、ListDictionary、Queue、NameValueCollection、List<T>、Dictionary<TKey,TValue>及数组等,要了解各个集合的特性,选择合适的集合。

在所有的集合中数组是性能最高的,如果要存储的数据类型一致和容量固定,特别是对值类型的数组进行操作时没有装箱和拆箱操作,效率极高。

在选择集合类型时应考虑几点:

(1)集合中的元素类型是否是一致的,比如集合中将要存储的元素都是int或者都是string类型的就可以考虑使用数组或者泛型集合,这样在存储数值类型元素就可以避免装箱拆箱操作,即使是引用类型的元素也可以避免类型转换操作。

(2)集合中的元素个数是否是固定的,如果集合中存储的元素是固定的并且元素类型是一致的就可以使用数组来存储。

(3)将来对集合的操作集中在那些方面,如果对集合的操作以查找居多可以考虑HashTable或者Dictionary<TKey,TValue>这样的集合,因为在.NETFramework中对这类集合采用了特殊机制,所以在查找时比较的次数比其它集合要少。

另外,在使用可变集合时如果不制定初始容量大小,系统会使用一个默认值来指定可变集合的初始容量大小,如果将来元素个数超过初始容量大小就会先在内部重新构建一个集合,再将原来集合中的元素复制到新集合中,可以在实例化可变集合时指定一个相对较大的初始容量,这样在向可变集合中添加大量元素时就可以避免集合扩充容量带来的性能损失。

System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。

System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。

System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。

 

数组

数组是大部分编程语言中都支持的一种数据类型,无论C语言、C++还是C#以及Java

都支持数组的概念。

数组是具有同一类型的多个对象的集合,是一种数据结构,包含同一类型的多个元素。数组是一组具有相同类型的变量的集合,如一组整数、一组字符等。组成数组的这些变量称为数组的元素。每个数组元素都有一个编号,这个编号叫做下标,C#中的下标是从0开始的,最大的下标等于数组元素个数减一。C#中可以通过下标来区别这些元素。数组元素的个数有时也称之为数组的长度。

数组类型从类型System.Array继承而来。System.Array类表示所有的数组,不论这些数组的元素类型或秩如何。对数组定义的操作有:根据大小和下限信息分配数组;编制数组索引以读取或写入值;计算数组元素的地址;以及查询秩、边界和数组中存储的值的总数。

1、  数组是固定大小的,不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!而集合却是可变长的。

2、 数组要声明元素的类型,集合类的元素类型却是object。

3、 数组可读可写,不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。

4、 数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。集合也是数据列表却不使用下标访问。很多时候集合有定制的下标类型,对于队列和栈根本就不支持下标访问!

1. 定义

一个数组的定义中包含以下几个要素:

Ø  元素类型(相同)

Ø  数组的维数(初始化时必须给定)

Ø  每个维数的上下限

首先,给定类型的数组只能保存该类型的元素。其次要规定数组的维数,可以用几何的知识理解数组的维数,可以用一维坐标轴来理解一维数组;用平面直角坐标系来理解二维数组;用三维立体坐标系来理解三维数组等。再次,数组必须规定每个维数的大小。

如:

int[] anIntArray;    //定义数组

anIntArray={1,2,3};//上述代码定义了一个数组并对其进行了初始化。可以一次完成

int [] sz=newint[];  //初始化数组,如果不指定大小,报语法错误。

anIntArray=new  int[]{1,2,3};//用new关键字初始化数组的元素

anIntArray=new  int[3]{1,2,3};//指定数组大小用new关键字初始化数组元素

数组还有另外一种初始化方式,即指定数组大小并用new关键字初始化数组的元素:

int[] anIntArray=new int[3];

执行时.NET将会为数组中的每一个元素赋予同一个(定义类型的)默认值。对于Int型的变量来说这个默认值是0。

2、数组的索引

数组的索引也就是通常所说的数组下标,英文为Index。数组的索引是从0开始的。

3、数组的遍历

C#提供了foreach语句以实现数组的遍历功能。可以使用foreach语句访问数组中的每个元素而不需要确切地知道每个元素的索引。

int[] myArray=newint[5]  {14, 25, 7,36, 53};

//采用foreach语句对myArray进行遍历

foreach(int numberinmyArray)

Console.Write(number);

for (int i= 0; i < 5; i++)

Console.Write(myArray[i]);