一、二维数组的样子
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}
{
{1, 2},
{3, 4, 5},
{6},
{7, 8, 9, 10}
}
二、二维数组是什么
定义:二维数组就是 “数组的数组”,即:以数组作为元素的数组。
用途:二维数组可以用来表示具有行和列二维结构的数据集合。
三、二维数组的分类
规则数组(矩形数组)
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}
特点:
每行的元素数量相同。(可以看作是一个标准的矩阵)
内存中是一个连续的块。
不规则数组(锯齿数组)
{
{1, 2},
{3, 4, 5},
{6},
{7, 8, 9, 10}
}
特点:
数组每行的元素数量可以不同。(因此它是一个数组的数组)
内存中是一个数组的数组,每行的长度可以不同。
四、声明二维数组的语法
语法(矩形数组)
//语法1
数据类型[,] 数组名 = new 数据类型[行数, 列数]; // 3行4列的规则二维数组
//语法2
数据类型[,] 数组名 = new 数据类型[,] {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
//语法3
数据类型[,] 数组名 = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
示例
int[,] matrix = new int[3, 4]; // 3行4列的规则二维数组
示例
int[,] matrix = new int[3, 4]
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
语法(锯齿数组)
数据类型[][] 数组名 = new 数据类型[行数][];
//方法2:声明锯齿数组(只声明第一维)
int[][] jaggedArray = new int[3][];
// 分别初始化每个子数组
jaggedArray[0] = new int[] {1, 2, 3};
jaggedArray[1] = new int[] {4, 5};
jaggedArray[2] = new int[] {6, 7, 8, 9};
//方法2
int[][] jaggedArray = new int[][] {
new int[] {1, 2, 3},
new int[] {4, 5},
new int[] {6, 7, 8, 9}
};
//方法3
// 使用简化语法
int[][] jaggedArray = {
new int[] {1, 2, 3},
new int[] {4, 5},
new int[] {6, 7, 8, 9}
};
string[][] names = {
new string[] {"张三", "李四"},
new string[] {"王五"},
new string[] {"赵六", "钱七", "孙八"}
};
示例
int[][] jaggedArray = new int[3][];
示例
int[][] jaggedArray = new int[3][]
{
new int[] { 1, 2, 3 }, // 第0行有3个元素
new int[] { 4, 5 }, // 第1行有2个元素
new int[] { 6, 7, 8, 9 } // 第2行有4个元素
};
访问数组元素
读操作(矩形数组)
Console.WriteLine(matrix[0, 1]); // 输出 2,第0行第1列的元素
Console.WriteLine(matrix[2, 3]); // 输出 12,第2行第3列的元素
写操作(矩形数组)
// 赋值
scores{0, 0} = 85; // 第一个学生的第一门成绩
scores{0, 1} = 90; // 第一个学生的第二门成绩
scores{1, 0} = 78; // 第二个学生的第一门成绩
读操作(锯齿数组)
Console.WriteLine(jaggedArray[0][1]); // 输出 2,第0行第1列的元素
Console.WriteLine(jaggedArray[2][3]); // 输出 9,第2行第3列的元素
遍历二维数组
遍历矩形数组
int{,} numbers = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 获取维度
int rows = numbers.GetLength(0); // 行数
int cols = numbers.GetLength(1); // 列数
// 使用嵌套循环遍历
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
Console.Write(numbers{i, j} + " ");
}
Console.WriteLine(); // 换行
}
遍历锯齿数组
// 外层循环遍历每个子数组
for (int i = 0; i < arr.Count; i++)
{
// 内层循环遍历当前子数组中的每个元素
for (int j = 0; j < arr[i].Count; j++)
{
Console.WriteLine(arr[i][j]);
}
}
课堂练习
学生成绩表
// 创建3个学生,每个学生有3门课的成绩表
int{,} gradeBook = {
{85, 92, 78},
{76, 88, 95},
{90, 87, 82}
};
// 计算每个学生的平均分
for (int student = 0; student < gradeBook.GetLength(0); student++)
{
int sum = 0;
for (int subject = 0; subject < gradeBook.GetLength(1); subject++)
{
sum += gradeBook{student, subject};
}
double average = (double)sum / gradeBook.GetLength(1);
Console.WriteLine($"学生{student + 1}的平均分: {average:F2}");
}