C#数组的声明和使用(非常详细)
如果我们在程序设计时,用变量存储数据且各变量间没有互相关联,那么可以将数据想象成下图,笔者用散乱的方式来表达相同数据类型的各个变量,在真实的内存中读者可以想象各变量在内存内并没有按照次序排放。
如果我们将相同类型的数据组织起来形成数组(array),可以将数据想象成下图,读者可以想象各变量在内存内依次序方式排放,如下所示。
当数据排成数组后,我们就可以用索引值(index)存取此数组特定位置的内容,在 C# 语言中索引从 0 开始,所以第 1 个元素的索引是 0,第 2 个元素的索引是 1,可以此类推,所以如果一个数组若是有 n 个元素,则此数组的索引在 0~(n-1)。
从上述说明我们可以得到,数组本身是一种结构化的数据类型,主要是将相同类型的数据集合起来,用一个名称来代表。存取数组中的数据值时,其用数组的索引值(index)指示所要存取的数据。
上述声明基本上是在声明数组数据类型与数组长度,同时配置内存空间,但是没有设定数组元素内容,未来读者有需求再在程序内自行设定数组元素内容。
例如,声明整型数组 sc,此数组长度是 5:
也可以用先声明数组数据,然后再声明数组长度,也就是分两行声明上述数组。注意,这个只是让读者了解可以用下列方式声明,建议还是使用上述方式:
在 C# 语言中,数组第一个元素的索引值一定是 0,下面是 sc 声明的说明图:
注意,索引放在中括号内,读者可以将上述看作是一个内存,sc 指向一个内存地址。
上述语句声明了整型数组,也可以用于声明浮点数、字符或字符串数组,如下所示:
【实例 1】数组声明方法 1,声明整型数组类型与长度的基础实例。
【实例 2】验证整型数组声明未给初始值时,数组元素的默认值是 0。
例如,声明整型数组sc,同时设定数组元素的初始值分别是 5、10、15、20 和 25。
也可以用下列分两行方式声明上述数组,但只是让读者了解可以用下列方式声明,建议还是使用上述方式:
【实例 3】声明数组类型与设定数组初始值。
如果要声明其他数据类型同时设定初始值,方法相同,下列是声明字符串数组同时设定初始值的实例:
【实例 4】设计数组时,有时候也需使用键盘输入数组内容。输入学生人数及学生成绩,然后输出全班的平均成绩。
【实例 5】不知道学生人数,以输入 0 当作输入成绩结束。
【实例 6】Max()、Min() 和 Sum() 方法的应用。
【实例 7】object 数组的应用。
例如,foreach 遍历一维数组:

如果我们将相同类型的数据组织起来形成数组(array),可以将数据想象成下图,读者可以想象各变量在内存内依次序方式排放,如下所示。

当数据排成数组后,我们就可以用索引值(index)存取此数组特定位置的内容,在 C# 语言中索引从 0 开始,所以第 1 个元素的索引是 0,第 2 个元素的索引是 1,可以此类推,所以如果一个数组若是有 n 个元素,则此数组的索引在 0~(n-1)。

从上述说明我们可以得到,数组本身是一种结构化的数据类型,主要是将相同类型的数据集合起来,用一个名称来代表。存取数组中的数据值时,其用数组的索引值(index)指示所要存取的数据。
C#数组的声明
数组的使用和其他的变量一样,使用前一定要先声明,以便编译程序能预留空间供程序使用,声明数组的同时可以声明数组的数据类型和长度(又称大小),声明的语法如下:数据类型[ ] 数组变量名称 = new 数据类型[数组长度];new 关键词主要是为数组名配置内存空间,也可以看作创建了一个实体(instance),一般常用的数组数据类型有整数、浮点数和字符。
上述声明基本上是在声明数组数据类型与数组长度,同时配置内存空间,但是没有设定数组元素内容,未来读者有需求再在程序内自行设定数组元素内容。
例如,声明整型数组 sc,此数组长度是 5:
int[] sc = new int[5]; // 声明整形数组,数组长度是 5,建议使用
也可以用先声明数组数据,然后再声明数组长度,也就是分两行声明上述数组。注意,这个只是让读者了解可以用下列方式声明,建议还是使用上述方式:
int[] sc; // 声明整形数组 sc = new int[5]; // 为整形数组配置 5 个元素空间表示声明一个长度为 5 的一维整型数组,长度为 5 相当于是数组内有 5 个元素,数组名是 sc。此外,此声明没有设定初始值,编译程序会自动设定数组初始值为 0。
在 C# 语言中,数组第一个元素的索引值一定是 0,下面是 sc 声明的说明图:

注意,索引放在中括号内,读者可以将上述看作是一个内存,sc 指向一个内存地址。
上述语句声明了整型数组,也可以用于声明浮点数、字符或字符串数组,如下所示:
int[] sc = new int[5]; // 声明整型数组,数组长度是 5,建议使用 float[] data1 = new float[5]; // 声明浮点数数组 double[] data2 = new double[5]; // 声明双精度浮点数数组 char[] data3 = new char[5]; // 声明字符数组 string[] data4 = new string[5]; // 声明字符串数组
【实例 1】数组声明方法 1,声明整型数组类型与长度的基础实例。
int[] sc = new int[5]; // 声明数组类型与长度 sc[0] = 5; sc[1] = 10; sc[2] = 15; sc[3] = 20; sc[4] = 25; for (int i = 0; i < 5; i++) Console.Write($"{sc[i]}\t");执行结果为:
5 10 15 20 25
【实例 2】验证整型数组声明未给初始值时,数组元素的默认值是 0。
int[] sc = new int[5]; // 声明数组类型与长度 for (int i = 0; i < 5; i++) // 输出数组初始值 Console.Write($"{sc[i]}\t");执行结果为:
0 0 0 0 0
C#数组的初始值
本节的声明是指声明数组时,同时设定数组元素的初始值。此种方法的语法如下:数据类型[ ] 数组变量名称 = {值1, 值2, … , 值n};虽然这种声明格式没有明确地指出数组长度,但是我们可以由数组元素的初始值数量得知数组的长度。
例如,声明整型数组sc,同时设定数组元素的初始值分别是 5、10、15、20 和 25。
int[ ] sc = {5, 10, 15, 20, 25}; // 声明整型数组,同时设定初始值,建议使用
也可以用下列分两行方式声明上述数组,但只是让读者了解可以用下列方式声明,建议还是使用上述方式:
int[ ] sc; sc = {5, 10, 15, 20, 25};虽然上述声明没有明确指出数组 sc 的长度是多少,但是我们只声明 5 个元素,所以可以知道此数组 sc 的长度是 5。
【实例 3】声明数组类型与设定数组初始值。
int[] sc = { 5, 10, 15, 20, 25 }; // 数组声明与设置初始值 for (int i = 0; i < 5; i++) Console.Write($"{sc[i]}\t");执行结果为:
5 10 15 20 25
注意,C语言不做数组边界检查,如果存取数组内容的索引超出数组范围,超出的部分显示的是内存的残值。相比之下,C# 语言会做数组边界检查,如果存取数组内容的索引超出数组范围,会有错误产生。如果要声明其他数据类型同时设定初始值,方法相同,下列是声明字符串数组同时设定初始值的实例:
string[ ] city = {"台北", "新竹", "竹东"};
【实例 4】设计数组时,有时候也需使用键盘输入数组内容。输入学生人数及学生成绩,然后输出全班的平均成绩。
int[] score = new int[10]; int sum = 0; int num; double ave; Console.Write("请输入学生人数 ==> "); num = int.Parse(Console.ReadLine()); for (int i = 0; i < num; i++) { Console.Write("请输入分数 ==> "); score[i] = int.Parse(Console.ReadLine()); sum += score[i]; } ave = (double)sum / num; Console.WriteLine($"平均分数是 {ave}");执行结果为:
请输入学生人数 ==> 4
请输入分数 ==> 58
请输入分数 ==> 66
请输入分数 ==> 87
请输入分数 ==> 60
平均分数是 67.75
【实例 5】不知道学生人数,以输入 0 当作输入成绩结束。
int[] score = new int[10]; double ave; int sum = 0; int i = 0; Console.WriteLine("输入成绩 0 代表结束"); do { Console.Write("请输入分数 ==> "); score[i] = int.Parse(Console.ReadLine()); sum += score[i]; } while (score[i++] > 0); ave = (double)sum / (i-1); Console.WriteLine($"平均分数是 {ave}");执行结果为:
输入成绩 0 代表结束 请输入分数 ==> 58 请输入分数 ==> 66 请输入分数 ==> 87 请输入分数 ==> 60 请输入分数 ==> 0 平均分数是 67.75
C#一维数组的常用方法
常见的一维数组方法如下:- Average():回传平均值;
- Max():回传最大值;
- Min():回传最小值;
- Sum():回传总和。
【实例 6】Max()、Min() 和 Sum() 方法的应用。
using System; using System.Linq; class Program { public static void Main(string[] args) { int[] arr = { 76, 32, 88, 45, 65 }; Console.WriteLine($"最大值 : {arr.Max()}"); Console.WriteLine($"最小值 : {arr.Min()}"); Console.WriteLine($"总和 : {arr.Sum()}"); Console.WriteLine($"平均 : {arr.Average()}"); } }执行结果为:
最大值 : 88
最小值 : 32
总和 : 306
平均 : 61.2
C# object数组
object 数据类型可以存储不同的数据,C# 也允许创建 object 数组,这个数组可以存储不同类型的数据。【实例 7】object 数组的应用。
object[] ball = { "James", 38, 36, 35, 26, 28 }; int score = 0; for (int i = 1; i < ball.Length; i++) score += (int)ball[i]; Console.WriteLine($"{ball[0]} 前 5 场得分总计 {score}");执行结果为:
James 前 5 场得分总计 163
上述程序第 4 行 ball.Length 中,Length 是数组的属性,此属性记录数组的数据元素个数,上述程序第 2 行没有指明 ball 数组元素个数,使用 Length 属性,可以让程序撰写循环次数时更便利。C# foreach遍历数组
C# 提供一个循环关键词 foreach,可以方便我们遍历数组,这个关键词特别适合我们不知道数组元素的个数时,可以用此方法迭代数组元素内容,此语法如下:foreach (数据类型 变量 in 数组)变量的数据类型需与数组元素相同,关键词 foreach 主要是用变量迭代所有的数组元素,在迭代过程也可以使用 break 中断此迭代。
例如,foreach 遍历一维数组:
int[] num = { 7, 8, 9, 1, 3, 5, 2, 4, 6 }; foreach (int n in num) { Console.Write($"{n} "); }执行结果为:
7 8 9 1 3 5 2 4 6