首页 > 编程笔记 > C#笔记 阅读:12

C#数组的声明和使用(非常详细)

如果我们在程序设计时,用变量存储数据且各变量间没有互相关联,那么可以将数据想象成下图,笔者用散乱的方式来表达相同数据类型的各个变量,在真实的内存中读者可以想象各变量在内存内并没有按照次序排放。


如果我们将相同类型的数据组织起来形成数组(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

上述程序直接输入了学生人数,如果我们一开始不知道学生人数,也可以输入 0 当作输入结束,这个 0 在程序语言概念中称为哨兵值(sentinel value)。

【实例 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#一维数组的常用方法

常见的一维数组方法如下:
【实例 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 

相关文章