版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的
4.1.1 数组基础
数组是一组逻辑上相互关联的值,所有的数组都是Array类,Array提供的属性和方法都适用。
例如一所小学X年级X班的40个学生:
学生1 学生2 学生3 学生4 。。。。学生40
我们可以用序号来给每个学生编号,那么这个数组就是学生(),数组名称为“学生”,后面有个括号表示这是一个数组。
数组的定义,一般不会直接使用:
Array 数组名称;
通常使用下面的语句:
数据类型[] 数组名称;
例如:
string[] students;
如果需要定义时候初始化数组大小,应该使用以下代码:
string[] students = new string[40];
注意:C#中数组的索引范围是从0开始,n-1结束,一共n个索引。以上代码定义了一个拥有40个学生的数组,成员为student[0]至student[39]。
注意:C#不像VB.Net一样能直接设置数组大小,例如
string[40] students;
是错误的,而VB.Net中可以直接使用:
Dim 学生姓名(39) As String
来设置数组大小。
另外一种定义数组大小的方法是直接在定义的时候赋值,例如以下代码:
string[] students = new string[] { "赵柯", "钱廷军", "张强", "王睿", "李军", "周国轩", "郑蕾", "王海" };
以上代码定义了一个大小为8(最大索引为7)的数组,并同时给数组元素赋了值。
获得数组中某个元素的值很简单,只需要传入数组名称[索引号]就可以了。例如以下代码将显示数组中的第2个(索引号为1)学生的姓名:
Console.WriteLine(students[1]);
另外,以下代码声明了一个空数组:
string[] students={ };
空数组可以避免空引用异常,如果要给空数组赋值,可以先使用Array.Resize来扩大数组,然后再赋值。
【例 4.1】【项目:code4-001】使用For循环给数组元素赋值。
static void Main(string[] args)
{
string[] students={ };
int arrSize = 40;
Array.Resize(ref students, arrSize);
//在知道数组大小的情况下,也可以直接使用:
//string[] students=new string[40];
//循环给学生姓名赋值
for (int i = 0; i < 40; i++)
students[i] = "姓名" + i.ToString();
//输出索引为1的学生姓名
Console.WriteLine("students(1)对应的值是 " + students[1]);
Console.ReadKey();
}
运行结果如下图所示:
图4-1 给学生数组赋值
通过Array类的Resize()方法可以扩大或者缩小数组内元素的数量,当使用Resize方法缩小或扩大数组后将保留原有数据,扩大数组时多出的元素将被置为null。
【例 4.2】【项目:code4-002】使用Resize方法扩大数组。
static void Main(string[] args)
{
string[] students = new string[] { "赵柯", "钱廷军", "张强", "王睿", "李军", "周国轩", "郑蕾", "王海" };
Console.WriteLine("学生数量:" + students.Length);
//遍历并输出数组中的元素
foreach (string student in students)
Console.Write(student + " ");
Console.WriteLine();
//数组在原有基础上增加2,并保留原有数据
Array.Resize(ref students, students.Length + 2);
students[8] = "方国溪";
students[9] = "刘韬";
Console.WriteLine("学生数量:" + students.Length);
foreach (string student in students)
Console.Write(student + " ");
Console.ReadKey();
}
运行结果如下图所示:
图4-2 使用Resize扩大数组元素
4.1.2 多维数组
假设一维数组是一条线上的一个点,它只具有一个索引就可以确定位置;
那么二维数组就是一个平面上的一个点,那么它需要两个索引来确定位置;
三维数组就是立体上的一个点,需要三个索引来确定位置;
四维数组就得还加上一个点;
依次类推。。。。
当然一般人对维度的理解有限,实际生活中也就关心的是三维空间(长、宽、高),有些人关注的多一点,关注四维空间(长、宽、高、时间);再更少更少的人,关注更多维空间,维度越多也就越复杂。
多维数组的声明是在括号内加入“,”(英文逗号),二维加入一个逗号,三维加入两个逗号,以此类推。例如下面的代码定义了一个三维数组:
Dim schoolStudents(2, 4, 39) As String
schoolStudents数组表示一个学校,其中第一个维度表示学校一共3个年级,第二个维度表示每个年级5个班级,第三个维度表示每个班40个学生。
也可以使用以下的定义:
Dim schoolStudents(,,) As String
ReDim schoolStudents(2, 4, 39)
多维数组也可以在定义的时候赋值,同时定义了数组大小。以下代码定义了一个二维数组,每一维的大小为3:
Dim students2(,) As String = {{"赵柯", "钱廷军", "张强"}, {"学生甲", "学生乙", "学生丙"}}
由于三维及三维以上数组的复杂度较高,理解和操作较难,本节重点以二维数组为例。
在4.1.1节的时候,笔者举例了一个班的学生来学习数组,如果以一个年级学生为例,假设班级序号为一个维度,学生序号为一个维度,就构成了二维数组
以下定义了XX学校1年级的学生姓名数组,
该年级共4个班,每个班40个学生:
Dim students(4, 39) As String
students(0, 0) = "赵柯"
students(0, 1) = "钱廷军"
students(0, 2) = "张强"
……
students(1, 0) = "陈廷"
students(1, 1) = "汪明睿"
students(1, 2) = "代晓杰"
……
Students数组的第一个维度是班级序号,第二个维度是班级上的学生序号。
【例 4.3】【项目:code4-003】遍历班级学生。
static void Main(string[] args)
{
//string[,,] schoolStudents = new string[2, 4, 39];
//简化起见,年级的班级缩小到了3个,每个班学生4人。
string[,] students = new string[3, 4];
students[0, 0] = "赵柯";
students[0, 1] = "钱廷军";
students[0, 2] = "张强";
students[0, 3] = "王睿";
students[1, 0] = "陈廷";
students[1, 1] = "汪明睿";
students[1, 2] = "代晓杰";
students[1, 3] = "庄慧云";
students[2, 0] = "袁宝军";
students[2, 1] = "秦天";
students[2, 2] = "龚国杰";
students[2, 3] = "郑贺";
string classStudents;
for(int i = 0;i< 3;i++)
{
classStudents = "";
for (int j = 0; j < 4; j++)
classStudents += students[i, j] + " ";
Console.WriteLine("一年级" + (i + 1).ToString() + "班学生有:" + classStudents);
}
Console.ReadKey();
}
运行结果如下图所示:
图4-3遍历班级学生
4.1.3 常用属性
数组总的大小(也就是数组里面所有元素的数量)可以使用Length属性获得。
数组某维的大小(也就是数组某一维元素的数量)可以使用GetLength(维序号)方法获得。
数组的维数(秩),可以使用Rank属性获得。
【例 4.4】【项目:code4-004】获得数组维数信息。
static void Main(string[] args)
{
string[,] students = new string[,] {
{"赵柯", "钱廷军", "张强", "王睿"},
{"陈廷", "汪明睿", "代晓杰", "庄慧云"},
{"袁宝军", "秦天", "龚国杰", "郑贺"}
};
int arrayRankSize = students.Rank;
Console.WriteLine("总的维数为:" + arrayRankSize);
Console.WriteLine("数组元素总数:" + students.Length);
int[] ranks = new int[arrayRankSize];
//得到每个维度的大小
for(int i =0;i< arrayRankSize;i++)
Console.WriteLine("第" + (i + 1) + "维的大小:" + students.GetLength(i));
Console.ReadKey();
}
运行结果如下图所示:
图4-4 数组维数信息
4.1.4 数组的合并
方法1:按照多个数组的大小重新定义一个新的数组,使用循环将旧数组的值写入新数组。
【例 4.5】【项目:code4-005】合并数组。
static void Main(string[] args)
{
string[] studentsClass1 = { "赵柯", "钱廷军", "张强", "王睿" };
string[] studentsClass2 = { "陈廷", "汪明睿", "代晓杰", "庄慧云" };
string[] studentsClass3 = { "袁宝军", "秦天", "龚国杰", "郑贺" };
string[] studentsAll = new string[studentsClass1.Length + studentsClass2.Length + studentsClass3.Length ];
for(int i = 0;i< studentsAll.Length;i++)
{
//加入第1个数组数据
if (i < studentsClass1.Length)
studentsAll[i] = studentsClass1[i];
//加入第2个数组数据
if ((i >= studentsClass1.Length) && (i < studentsClass1.Length + studentsClass2.Length))
studentsAll[i] = studentsClass2[i - studentsClass1.Length];
//加入第3个数组数据
if( i >= studentsClass1.Length + studentsClass2.Length )
studentsAll[i]= studentsClass3[i - studentsClass2.Length - studentsClass1.Length];
}
for(int i= 0;i< studentsAll.Length;i++)
{
Console.Write(studentsAll[i] + " ");
if ((i+1) % 4 == 0)
Console.WriteLine();
}
Console.ReadKey();
}
运行结果如下图所示:
图4-5 数组合并
方法2:使用Array类的Copy方法将旧数组的值拷贝到新数组,其中常用的两个重载版本:
Public Shared Sub Copy ( sourceArray As Array, destinationArray As Array, length As Integer )
参数说明:
Public Shared Sub Copy ( sourceArray As Array, sourceIndex As Integer, destinationArray As Array, destinationIndex As Integer, length As Integer )
参数说明:
- sourceArray:源数组。
- sourceIndex:源数组中复制开始处的索引。
- destinationArray:目标数组。
- destinationIndex:目标数组中存储开始处的索引。
- length:复制的元素数目。
【例 4.6】【项目:code4-006】合并数组。
static void Main(string[] args)
{
string[] studentsClass1 = { "赵柯", "钱廷军", "张强", "王睿" };
string[] studentsClass2 = { "陈廷", "汪明睿", "代晓杰", "庄慧云" };
string[] studentsClass3 = { "袁宝军", "秦天", "龚国杰", "郑贺" };
string[] studentsAll= { };
//重新定义studentsAll数组大小为以上三个数组大小之和
Array.Resize(ref studentsAll, studentsClass1.Length + studentsClass2.Length + studentsClass3.Length);
//从studentsClass1拷贝studentsClass1长度的元素到studentsAll
Array.Copy(studentsClass1, studentsAll, studentsClass1.Length);
//从studentsClass2的0索引处,拷贝studentsClass2长度的元素,到studentsAll的studentsClass1.Length索引处
Array.Copy(studentsClass2, 0, studentsAll, studentsClass1.Length, studentsClass2.Length);
Array.Copy(studentsClass3, 0, studentsAll, studentsClass1.Length + studentsClass2.Length, studentsClass3.Length);
for (int i = 0; i < studentsAll.Length; i++)
{
Console.Write(studentsAll[i] + " ");
if ((i + 1) % 4 == 0)
Console.WriteLine();
}
Console.ReadKey();
}
运行结果同【例 4.5】。
4.1.5 常见错误
【例 4.7】【项目:code4-007】合并数组。
static void Main(string[] args)
{
string[,] students = new string[2, 3];
for (int i = 0; i < 2; i++)
for (int j = 0; j < 4; j++)
students[i, j] = (i + 1) + "班第" + (j + 1) + "号学生";
}
由于我们定义的数组中班级学生最多为4个,现在超过了4个,运行时VB.Net就会提示错误:
图4-6 索引超出了数组界限
解决方法就是确保使用的数组元素的索引一定要在数组大小范围内。将的代码中:
for (int j = 0; j < 4; j++)
修改为:
for (int j = 0; j < 3; j++)
确保在数组有效范围即可。
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看C#教程 目录