CodeGym /课程 /C# SELF /二维数组

二维数组

C# SELF
第 7 级 , 课程 4
可用

1. 入门

想象一下普通数组就像一只长长的披萨盒,所有的披萨块都排成一排——好吃,但有点单调。

现在再想想工作日程表或者国际象棋棋盘。那里面一切都被安排成——也就是表格。这就是二维数组的经典用法啦。

在现实生活中,二维数组随处可见:

  • 员工工资表(行——员工,列——月份)。
  • 屏幕上的图片(每个“格子”是像素的颜色,有两个坐标:X和Y)。
  • 矩阵计算和数据处理。
  • 国际象棋棋盘或者井字棋的棋盘。

有时候二维数组也叫矩阵(这个词是从数学里来的)。

有很多地方你作为程序员会用到二维数组。几乎任何桌游的实现——都是现成的二维数组:“国际象棋”、“跳棋”、“井字棋”、“海战”:

二维数组 2

“国际象棋”或者“海战”的棋盘,简直就是为二维数组量身定做的,格子的坐标只需要用数字来表示。不再是“兵 e2 → e4”,而是“兵 (4,1) → (4,3)”。这样你写代码会更轻松。

2. 二维数组的声明语法

其实只有第一次声明才会有点慌!一步一步来就好。

通用规则

类型[,] 数组名;
二维数组的声明

这里括号里的逗号,不是编译器熬夜喝咖啡写错了,而是明确告诉你:这个数组是二维的。

例子

int[,] matrix;
double[,] gradesTable;
string[,] chessBoard;

创建数组

设置大小:行数列数

matrix = new int[3, 4]; // 3行,4列

这就是一个3x4的小表格:想象一下Excel里有3行4列。

你也可以直接声明变量并创建二维数组:

int[,] matrix = new int[3, 4];

还可以直接用值初始化(和一维数组差不多):

int[,] example = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
// 表格 3行,3列
用值初始化二维数组

注意:用这种方式初始化时,所有行的长度必须一样。不能第一行3个元素,第二行2个。

可视化示意图

┌─────┬─────┬─────┬─────┐
│  0  │  1  │  2  │  3  │  ← 列 (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │0,1  │0,2  │0,3  │  ← 第0行 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │1,1  │1,2  │1,3  │  ← 第1行 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │2,1  │2,2  │2,3  │  ← 第2行 (Row 2)
└─────┴─────┴─────┴─────┘

每个元素都用一对索引[行, 列]来定位。

3. 索引和访问元素

在二维数组里,访问元素要用两个索引

  • 第一个——行号
  • 第二个——列号

matrix[1, 2] = 99;  // 在第二行(索引1),第三列(索引2)
给二维数组的元素赋值

如果你玩过国际象棋,记住:索引是从0开始的。也就是说,第一个元素是[0, 0]

写入和读取

int[,] data = new int[5, 2];
data[1, 1] = 5;         // 写入
int value = data[1, 1]; // 读取

在内存里大概长这样:

二维数组

4. 填充二维数组

来写个代码,把矩阵填成1到12的连续数字,这样你就能明白它是怎么工作的。

int[,] matrix = new int[3, 4];
int value = 1;

for (int row = 0; row < 3; row++)
{
    for (int col = 0; col < 4; col++)
    {
        matrix[row, col] = value;
        value++;
    }
}
顺序填充二维数组

这里外层循环遍历,内层循环遍历

示意图:

执行后:
┌────┬────┬────┬────┐
│ 1  │ 2  │ 3  │ 4  │
├────┼────┼────┼────┤
│ 5  │ 6  │ 7  │ 8  │
├────┼────┼────┼────┤
│ 9  │10  │11  │12  │
└────┴────┴────┴────┘

5. 维度:获取行数和列数

很多时候你需要“动态”获取数组的大小。在C#里有个很方便的方法GetLength()

int[,] matrix = new int[3, 4];

int rows = matrix.GetLength(0);    // 行数(第一个维度)- 3
int columns = matrix.GetLength(1); // 列数(第二个维度)- 4

Console.WriteLine($"行: {rows}, 列: {columns}");
注意:

别和Length搞混——对于二维数组,它是所有元素的总数(行 × 列)。

6. 输出二维数组到屏幕

输出二维表格通常用双重循环——就像在控制台里画迷宫。例子:

for (int row = 0; row < matrix.GetLength(0); row++)
{
    for (int col = 0; col < matrix.GetLength(1); col++)
    {
        Console.Write(matrix[row, col] + "\t"); // "\t"——制表符,让输出更美观
    }
    Console.WriteLine(); // 换行
}

输出示例:

1	2	3	4	
5	6	7	8	
9	10	11	12	

顺便说一句,你现在已经学会用几行代码就能“画”出漂亮的表格啦!

7. 多维数组

还有一个关于数组的有趣事实,你可能已经猜到了。如果能做二维数组,那三维的也可以吗?

没错,数组可以有任意多的维度。这种数组叫多维数组

怎么声明多维数组

只要用逗号分隔需要的维度数量就行:

int[,,,] matrix = new int[2, 3, 4, 5];
四维数组的声明

这里我们有一个四维数组:

  • 第一个坐标2个元素,
  • 第二个3个,
  • 第三个4个,
  • 第四个5个。

在内存里,这种数组就是一个很大的“数据立方体”,顺序打包起来。

怎么访问元素

访问元素时要同时给出所有索引:

matrix[0, 1, 2, 3] = 42;
int value = matrix[1, 2, 0, 4];
  • 索引还是从0开始,就像C#里一直那样。
  • 这样的数组总共有2 × 3 × 4 × 5 = 120个元素。

多维数组的实际例子

  • 2D——表格、国际象棋棋盘、图片。
  • 3D——计算机图形里的“立方体”、科学计算的数据(比如不同空间和时间点的温度)。
  • 4D及以上——很少用,但在高级数学、仿真、机器学习等领域会遇到。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION