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

C#二维数组的声明、初始化和使用(附带实例)

二维数组是一种特殊的多维数组,多维数组是指可以用多个索引访问的数组,在声明时,用多个中括号或者在中括号内加逗号,就表明是多维数组,有 n 个中括号或者在中括号内有 n 个逗号,就表示是 n+1 维数组。

下面以最常用的二维数组为例讲解多维数组的使用。

C#二维数组的声明

想象一下,快捷酒店的每一楼层都有很多房间,这些房间都可以构成一维数组,如果这家酒店有 500 间房,并且所有的房间都在同一楼层里,那么拿到 499 号房钥匙的旅客可能就不高兴了,因为从 1 号房走到 499 号房要花好长时间。因此每家酒店都有很多楼层,每一楼层都会有很多房间,形成一个立体的结构,把大量的房间均摊到每一楼层,这种结构就是二维表结构。

在计算机中,二维表结构可以使用二维数组来表示。使用二维表结构表示快捷酒店每一楼层的房间号的效果如下图所示。


图 1 二维表结构表示的楼层房间号

二维数组常用于表示二维表,表中的信息以行和列的形式表示,第一个下标代表元素所在的行,第二个下标代表元素所在的列。

声明二维数组的语法如下:
type[,] arrayName;
type[][] arrayName;

例如,声明一个 int 类型的二维数组,可以使用下面两种形式:
int[,] myarr;       // 声明一个int类型的二维数组,名称为myarr
int[][] myarr;      // 声明一个int类型的二维数组,名称为myarr
与一维数组一样,二维数组在声明时也没有分配内存空间,同样也可以使用关键字 new 先分配内存,然后才可以访问每个元素。

对于二维数组,有两种为数组分配内存的方式。

1) 直接为每一维分配内存空间

例如,定义一个二维数组,并直接为其分配内存空间,代码如下:
int[,] a = new int[2, 4]; // 定义一个2行4列的int类型二维数组
上面的代码定义了一个 int 类型的二维数组 a,二维数组 a 中包括两个长度为 4 的一维数组,内存分配如下图所示:


图 2 二维数组内存分配(第一种方式)

2) 分别为每一维分配内存空间

例如,定义一个二维数组,分别为每一维分配内存空间,代码如下:
int[][] a = new int[2][]; // 定义一个2行的int类型二维数组
a[0] = new int[2];        // 初始化二维数组的第1行有2个元素
a[1] = new int[3];        // 初始化二维数组的第2行有3个元素
通过第二种方式为二维数组分配内存如下图所示:


图 3 二维数组内存分配(第二种方式)

在上面的代码中,由于为每一维分配的内存空间不同。因此,a 相当于一个不规则二维数组。

C#二维数组的初始化

二维数组有两个索引(即下标),构成由行列组成的一个矩阵,如下图所示。


图 4 二维数组索引与行列的关系

二维数组的初始化主要分为 3 种:

1) 为单个二维数组元素赋值

为单个二维数组元素赋值,即首先声明一个二维数组,并指定行数和列数,然后为二维数组中的每个元素进行赋值,例如:
int[,] myarr = new int[2, 2]; // 定义一个int类型的二维数组
myarr[0, 0] = 0;            // 为二维数组中的第1行第1列赋值
myarr[0, 1] = 1;            // 为二维数组中的第1行第2列赋值
myarr[1, 0] = 1;            // 为二维数组中的第2行第1列赋值
myarr[1, 1] = 2;            // 为二维数组中的第2行第2列赋值

使用这种方式对二维数组进行赋值时,通常使用嵌套的循环实现,例如,上面的代码可以修改为如下形式:
int[,] myarr = new int[2, 2]; // 定义一个int类型的二维数组
for (int i = 0; i < 2; i++) // 遍历二维数组的行
{
    for (int j = 0; j < 2; j++) // 遍历二维数组的列
    {
        myarr[i, j] = i + j; // 为遍历到的二维数组中的第i行第j列赋值
    }
}

2) 为每一维数组元素赋值

为二维数组中的每一维数组元素赋值时,首先需要使用“数组类型 [ ] [ ]”形式声明一个数组,并指定数组的行数,然后分别为每一维数组元素赋值。

例如:
int[][] myarr = new int[2][]; // 定义一个2行的int类型二维数组
myarr[0] = new int[] { 0, 1 }; // 初始化二维数组的第1行
myarr[1] = new int[] { 1, 2 }; // 初始化二维数组的第2行

3) 同时为整个二维数组赋值

同时为整个二维数组赋值时需要使用嵌套的大括号,将要赋值的数据包含在里层大括号中,每个大括号中间用逗号(,)隔开。

例如:
int[,] myarr = new int[2, 2] { { 12, 0 }, { 45, 10 } };
int[,] myarr = new int[,] { { 12, 0 }, { 45, 10 } };
int[,] myarr = { { 12, 0 }, { 45, 10 } };
以上 3 种形式实现的效果是一样的,都是定义了一个长度为 2 行 2 列的 int 类型二维数组,并进行了初始化,其中,后两种形式会自动计算数组的行数和列数。

C#二维数组的使用

【实例 1】创建一个控制台应用程序,模拟制作一个简单的客车售票系统,假设客车的座位是 9 行 4 列,使用一个二维数组记录客车售票系统中的所有座位号,并在每个座位号上都显示“【有票】”,然后用户输入一个坐标位置,按<Enter>键,即可将该座位号显示为“【已售】”。代码如下:
static void Main(string[] args)
{
    Console.Title = "简单客车售票系统"; // 设置控制台标题
    string[,] zuo = new string[9, 4];  // 定义二维数组
    for (int i = 0; i < 9; i++)       // for循环开始
    {
        for (int j = 0; j < 4; j++)   // for循环开始
        {
            zuo[i, j] = "【有票】";    // 初始化二维数组
        }
    }
    string s = string.Empty;          // 定义字符串变量
    while (true)                     // 开始售票
    {
        Console.Clear();             // 清空控制台信息
        Console.WriteLine("\n    简单客车售票系统" + "\n"); // 输出字符串
        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                System.Console.Write(zuo[i, j]); // 输出售票信息
            }
            Console.WriteLine();
        }
        Console.WriteLine("请输入座位行号和列号(如:0,2)输入q键退出:");
        s = Console.ReadLine();       // 售票信息输入
        if (s == "q") break;         // 输入字符串“q”退出系统
        string[] ss = s.Split(',');   // 拆分字符串
        int one = int.Parse(ss[0]);   // 得到座位行数
        int two = int.Parse(ss[1]);   // 得到座位列数
        zuo[one, two] = "【已售】";   // 标记售票状态
    }
}
代码注解:
程序运行效果如下:

    简单客车售票系统

【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
请输入座位行号和列号(如:0,2)输入q键退出:6,1

    简单客车售票系统

【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【已售】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
请输入座位行号和列号(如:0,2)输入q键退出:
...

相关文章