如果需要使用同一类型的多个对象,就可以使用集合和数组。C#用特殊的记号声明和使用数组。
在声明数组时,应先定义数组中元素的类型,其后是一个空方括号和一个变量名。
int[] myArray;
myArray = new int[5];
或者
int[] myArray = new int[5];
声明数组并赋初始值
int[] myArray = new int[5]{1, 2, 3, 4,5};
不指定数组大小,编译器自动计算数组长度
int[] myArray = new int[]{1, 2,3,4,5,6,7,8,9,0};
访问数组
int v1 = myArray[0];
int v2 = myArray[2];
myArray[3] = 100;
for (int i =0; i>myArray.Length; i++)
{
Console.WriteLine(myArray[i]);
}
for( int val in myArray)
{
Console.WriteLine(val);
}
一般数组(也称为一维数组)用一个整数来索引。多维数组用两个或多个整数来索引。
在 C#中声明这个二维数组,需要在括号中加上一个逗号。数组在初始化时应指定每一维的大小
(也称为阶)。接着,就可以使用两个整数作为索引器,来访问数组中的元素了
int[,] towdim = new int[3,3]; // 声明3x3数组
twodim[0,0] = 1;
twodim[0,1] = 2;
twodim[0,2] = 3;
twodim[1,0] = 4;
twodim[1,1] = 5;
twodim[1,2] = 6;
twodim[2,0] = 7;
twodim[2,1] = 8;
twodim[2,2] = 9;
数组声明之后,就不能修改其阶数了。
数组声明时赋初值:
int[,] twodim = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
};
二维数组的大小是矩形的,例如 3×3 个元素。而锯齿数组的大小设置是比较灵活的,在锯齿数组
中,每一行都可以有不同的大小。在声明锯齿数组时,要依次放置开闭括号。在初始化锯齿数组时,先设置该数组包含的行数。定义各行中元素个数的第二个括号设置为空,因为这类数组的每一行包含不同的元素数。之后,为每一行指定行中的元素个数:
int[][] jagged = new int[3][];
jagged[0] = new int[2] {1, 2};
jagged[1] = new int[6] {3, 4, 5, 6, 7, 8};
jagged[2] = new int[3] {9, 10, 11};
用括号声明数组是 C#中使用 Array 类的记号。在后台使用 C#语法,会创建一个派生于抽象基类
Array 的新类。这样,就可以使用 Array 类为每个 C#数组定义的方法和属性了。
Array 类是一个抽象类,所以不能使用构造函数来创建数组。但除了可以使用 C#语法创建数组实
例之外,还可以使用静态方法 CreateInstance()创建数组。如果事先不知道元素的类型,就可以使用该静态方法,因为类型可以作为 Type 对象传送给 CreateInstance()方法,可以用 SetValue()方法设置值,用 GetValue()方法读取值。
Array intArray = Array.CreateInstance(typeof(int), 5);
for (int i=0; i<5; i++)
{
intArray.SetValue(10, i);
}
for (int i=0; i<5; i++)
{
Console.WriteLine(intArray.GetValue(i));
}
将已创建的数组强制转换成声明为 int[]的数组:
int[] intArray2 = (int[])intArray1;
Array 类实现了 IEumerable、ICollection 和 IList 接口,以访问和枚举数组中的元素。由于用定制
数组创建的类派生于 Array 抽象类,所以能使用通过数组变量执行的接口中的方法和属性。
IEumerable 接口
IEumerable 是由 foreach 语句用于迭代数组的接口。这是一个非常特殊的特性。
ICollection 接口
ICollection 接口派生于 IEumerable 接口,并添加了如表 5-2 所示的属性和方法。这个接口主要用
于确定集合中的元素个数,或用于同步。
IList 接口
IList 接口派生于 ICollection 接口,并添加了下面的属性和方法。Array 类实现 IList 接口的主要原因是,IList 接口定义了 Item 属性,以使用索引器访问元素。IList 接口的许多其他成员是通过Array类抛出 NotSupportedException 异常实现的,因为这些不应用于数组。
在 foreach 语句中使用枚举,可以迭代集合中的元素,且无需知道集合中的元素个数。图 5-7 显示了调用 foreach 方法的客户机和集合之间的关系。数组或集合执行带 GetEumerator()方法的IEumerable 接口。GetEumerator()方法返回一个执行 IEumerable 接口的枚举。接着,foreach 语句就可以使用 IEumerable 接口迭代集合了。
foreach(Person p in persons)
{
Console.WriteLine(p);
}
IEnumerator enumerator = persons.GetEnumerator();
while(enumerator.MoveNext())
{
Person p = (Person)enumerrator.Current;
Console.WriteLine(p);
}
using System;
using System.Collection;
namespace Wrox.ProCSharp.Arrays
{
public class HelloCollection
{
public IEumeration GetEumerator()
{
yield return "Hello";
yield return "World";
}
}
}
public class Program
{
HelloCollection helloCollection = new HelloCollection();
foreach(string s in helloCollection)
{
Console.WriteLine(s);
}
}