CSharp(十五) 多维数组
C# 中的多维数组(Multi-dimensional Arrays)是一种用于存储多个数据的数组,每个数据可以是不同的类型。
定义
多维数组是指具有两个或更多维度的数组。在 C# 中,多维数组分为矩形数组(Rectangular Array)和交错数组(Jagged Array)。本文只讨论矩形多维数组。
声明语法
// 二维数组
dataType[,] arrayName;
// 三维数组
dataType[,,] arrayName;
// n维数组
dataType[d1,d2,...,dn] arrayName;
创建与初始化
// 1. 声明后使用 new 创建
int[,] matrix = new int[3, 4]; // 3行4列的二维数组,元素默认值为0
// 2. 声明时直接初始化
int[,] matrix2 = new int[,] {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 3. 简写形式(省略 new 和类型)
int[,] matrix3 = {
{1, 2, 3},
{4, 5, 6}
};
// 4. 三维数组示例
int[,,] cube = new int[2, 3, 4];
int[,,] cube2 = new int[,,] {
{
{1, 2},
{3, 4}
},
{
{5, 6},
{7, 8}
}
};
使用
访问元素
int[,] matrix = {
{1, 2, 3},
{4, 5, 6}
};
// 访问元素:使用逗号分隔的索引
int value = matrix[0, 1]; // 获取第0行第1列的值:2
matrix[1, 2] = 10; // 设置第1行第2列的值为10
获取数组维度信息
int[,] matrix = new int[3, 4];
// 获取维度数(秩)
int rank = matrix.Rank; // 结果:2
// 获取指定维度的长度
int rows = matrix.GetLength(0); // 第0维长度:3
int cols = matrix.GetLength(1); // 第1维长度:4
// 获取总元素数
int total = matrix.Length; // 结果:12
// 获取指定维度的上界/下界
int upperBound0 = matrix.GetUpperBound(0); // 第0维上界:2
int lowerBound0 = matrix.GetLowerBound(0); // 第0维下界:0
遍历多维数组
int[,] matrix = {
{1, 2, 3},
{4, 5, 6}
};
// 方法1:使用嵌套 for 循环(推荐)
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
Console.Write($"{matrix[i, j]} ");
}
Console.WriteLine();
}
// 方法2:使用 foreach(按行优先顺序遍历)
foreach (int item in matrix)
{
Console.Write($"{item} ");
}
// 输出:1 2 3 4 5 6
多维数组作为方法参数
// 接收二维数组
void PrintMatrix(int[,] matrix)
{
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
Console.Write($"{matrix[i, j]} ");
}
Console.WriteLine();
}
}
// 返回二维数组
int[,] CreateIdentityMatrix(int size)
{
int[,] matrix = new int[size, size];
for (int i = 0; i < size; i++)
{
matrix[i, i] = 1;
}
return matrix;
}
注意事项
1. 矩形数组 vs 交错数组
| 特性 | 矩形数组 int[,] |
交错数组 int[][] |
|---|---|---|
| 内存布局 | 连续内存块 | 数组的数组(不连续) |
| 每行长度 | 必须相同 | 可以不同 |
| 声明方式 | int[,] |
int[][] |
| 初始化 | new int[3,4] |
new int[3][] |
| 性能 | 访问更快(缓存友好) | 灵活性更高 |
// 矩形数组:3行4列,每行长度固定
int[,] rectangular = new int[3, 4];
// 交错数组:3行,每行长度可不同
int[][] jagged = new int[3][];
jagged[0] = new int[4];
jagged[1] = new int[2]; // 第2行只有2个元素
jagged[2] = new int[5]; // 第3行有5个元素
2. 索引从 0 开始
C# 数组所有维度的索引都从 0 开始:
int[,] arr = new int[3, 4];
// 有效索引范围:
// 第0维:0, 1, 2
// 第1维:0, 1, 2, 3
// arr[3, 0] 会抛出 IndexOutOfRangeException
3. 初始化时必须指定所有维度大小
// 正确
int[,] a = new int[3, 4];
// 错误:不能省略维度大小
// int[,] b = new int[,]; // 编译错误
// int[,] c = new int[3,]; // 编译错误
4. 初始化器必须保持矩形结构
// 正确:每行元素数量相同
int[,] a = {
{1, 2, 3},
{4, 5, 6}
};
// 错误:每行元素数量不同会导致编译错误
// int[,] b = {
// {1, 2},
// {3, 4, 5} // 错误!
// };
5. 多维数组是引用类型
int[,] a = {{1, 2}, {3, 4}};
int[,] b = a; // b 引用同一个数组对象
b[0, 0] = 100;
Console.WriteLine(a[0, 0]); // 输出:100
// 如果需要复制,必须手动创建新数组
int[,] c = new int[2, 2];
Array.Copy(a, c, a.Length);
6. 不能改变数组维度大小
数组创建后,各维度的大小是固定的:
int[,] arr = new int[3, 4];
// 无法直接调整大小,需要创建新数组
int[,] newArr = new int[5, 6];
Array.Copy(arr, newArr, arr.Length);
arr = newArr; // 重新引用
7. 性能考虑
- 矩形数组在内存中是连续存储的,访问效率高
- 遍历时按行优先顺序(最右维度变化最快)效率最高
- 大数组考虑使用
Array.Clear而不是循环清零
int[,] largeArray = new int[1000, 1000];
// 高效清零
Array.Clear(largeArray, 0, largeArray.Length);
8. 与 Array 类的关系
多维数组继承自 System.Array,可以使用数组的通用方法:
int[,] arr = {{1, 2}, {3, 4}};
// 使用 Array 类的方法
Array.Reverse(arr); // 反转(对多维数组效果有限)
int index = Array.IndexOf(arr, 3); // 查找元素索引(按行优先展开)
Array.Sort(arr); // 排序(对多维数组效果有限)
总结
多维数组(矩形数组)适合表示表格、矩阵、图像像素等固定大小的多维数据。其特点是:
- 使用逗号
,分隔维度声明和索引访问 - 内存连续,访问效率高
- 各维度大小固定,结构严格矩形
- 索引从 0 开始
- 是引用类型,赋值操作复制引用而非数据