C#基础知识 5:数组
5.2 多维数组
多维数组 是一种存储在连续内存位置的相同类型元素的集合,但这些元素按多个维度组织。常见的多维数组包括二维数组、三维数组等。以下是关于多维数组的详细讲解,包括其优点、缺点以及代码示例。
5.2.1 多维数组的基本概念
多维数组 是存储在连续内存位置的相同类型元素的集合,但这些元素按多个维度组织。常见的多维数组包括二维数组、三维数组等。
示例:
csharp
int[,] matrix = new int[2, 3]; // 声明一个2行3列的二维数组
matrix[0, 0] = 1; // 设置第一个元素
matrix[0, 1] = 2; // 设置第二个元素
// ...
Console.WriteLine(matrix[0, 0]); // 输出第一个元素
5.2.2 多维数组的声明和初始化
声明二维数组:
csharp
int[,] matrix; // 声明一个二维整数数组
初始化二维数组:
csharp
int[,] matrix = new int[2, 3]; // 声明并初始化一个2行3列的二维数组
使用数组初始化器:
csharp
int[,] matrix = { { 1, 2, 3 }, { 4, 5, 6 } }; // 声明并初始化二维数组
示例:
csharp
using System;
class Program
{
static void Main(string[] args)
{
// 声明并初始化二维数组
int[,] matrix = new int[2, 3];
matrix[0, 0] = 1;
matrix[0, 1] = 2;
matrix[0, 2] = 3;
matrix[1, 0] = 4;
matrix[1, 1] = 5;
matrix[1, 2] = 6;
// 使用数组初始化器
int[,] matrix2 = { { 1, 2, 3 }, { 4, 5, 6 } };
// 访问数组元素
Console.WriteLine(matrix[0, 0]); // 输出: 1
Console.WriteLine(matrix2[1, 2]); // 输出: 6
}
}
5.2.3 多维数组的优点
-
组织数据:
- 多维数组可以按多个维度组织数据,适合表示矩阵、表格等结构。
- 提高数据的组织性和可读性。
-
快速访问:
- 多维数组元素通过索引访问,访问速度非常快。
- 时间复杂度为 O(1)。
-
内存效率:
- 多维数组存储在连续的内存位置,内存使用效率高。
- 适合存储大量相同类型的元素。
-
内置方法:
- 多维数组提供了许多内置方法,如
Length
、GetLength
、Copy
、Sort
等。 - 提高了数组操作的便利性。
- 多维数组提供了许多内置方法,如
-
简化代码:
- 多维数组可以简化处理矩阵和表格数据的代码。
- 例如,矩阵运算、数据表操作等。
5.2.4 多维数组的缺点
-
固定大小:
- 多维数组的大小在创建时确定,不能动态调整。
- 如果需要动态调整大小,需要创建新的数组并复制元素。
-
内存浪费:
- 如果多维数组大小设置过大,可能会导致内存浪费。
- 如果多维数组大小设置过小,可能会频繁调整大小。
-
插入和删除:
- 插入和删除元素需要移动其他元素,性能较差。
- 时间复杂度为 O(n)。
-
类型固定:
- 多维数组中的所有元素必须是相同类型。
- 不能存储不同类型的数据。
-
复杂性增加:
- 对于复杂的操作,多维数组可能需要额外的代码来实现。
- 例如,排序、查找等操作需要手动实现或使用内置方法。
5.2.5 多维数组的代码示例
以下是一些详细的代码示例,展示了如何声明、初始化和操作多维数组。
示例1:声明和初始化二维数组
文件1:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
// 声明并初始化二维数组
int[,] matrix = new int[2, 3];
matrix[0, 0] = 1;
matrix[0, 1] = 2;
matrix[0, 2] = 3;
matrix[1, 0] = 4;
matrix[1, 1] = 5;
matrix[1, 2] = 6;
// 使用数组初始化器
int[,] matrix2 = { { 1, 2, 3 }, { 4, 5, 6 } };
// 访问数组元素
Console.WriteLine(matrix[0, 0]); // 输出: 1
Console.WriteLine(matrix2[1, 2]); // 输出: 6
}
}
示例2:遍历二维数组
文件1:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
int[,] matrix = { { 1, 2, 3 }, { 4, 5, 6 } };
// 使用嵌套 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();
}
// 使用 foreach 循环遍历二维数组(不推荐,因为 foreach 不能直接获取索引)
foreach (int element in matrix)
{
Console.Write(element + " ");
}
}
}
示例3:获取数组维度和长度
文件1:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
int[,] matrix = { { 1, 2, 3 }, { 4, 5, 6 } };
// 获取数组的维度
int rows = matrix.GetLength(0);
int columns = matrix.GetLength(1);
Console.WriteLine($"Rows: {rows}, Columns: {columns}"); // 输出: Rows: 2, Columns: 3
// 获取数组的总长度
int totalLength = matrix.Length;
Console.WriteLine($"Total Length: {totalLength}"); // 输出: Total Length: 6
}
}
示例4:二维数组排序
文件1:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
int[,] matrix = { { 5, 3, 8 }, { 1, 2, 4 } };
// 将二维数组转换为一维数组
int[] flatArray = new int[matrix.GetLength(0) * matrix.GetLength(1)];
int index = 0;
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
flatArray[index++] = matrix[i, j];
}
}
// 排序一维数组
Array.Sort(flatArray);
// 将排序后的一维数组转换回二维数组
index = 0;
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
matrix[i, j] = flatArray[index++];
}
}
// 输出排序后的二维数组
Console.WriteLine("Sorted 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();
}
}
}
示例5:二维数组复制
文件1:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
int[,] sourceMatrix = { { 1, 2, 3 }, { 4, 5, 6 } };
int[,] destinationMatrix = new int[sourceMatrix.GetLength(0), sourceMatrix.GetLength(1)];
// 复制二维数组
for (int i = 0; i < sourceMatrix.GetLength(0); i++)
{
for (int j = 0; j < sourceMatrix.GetLength(1); j++)
{
destinationMatrix[i, j] = sourceMatrix[i, j];
}
}
// 输出复制后的二维数组
Console.WriteLine("Copied matrix:");
for (int i = 0; i < destinationMatrix.GetLength(0); i++)
{
for (int j = 0; j < destinationMatrix.GetLength(1); j++)
{
Console.Write(destinationMatrix[i, j] + " ");
}
Console.WriteLine();
}
}
}
示例6:三维数组
文件1:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
// 声明并初始化三维数组
int[,,] cube = new int[2, 2, 3];
cube[0, 0, 0] = 1;
cube[0, 0, 1] = 2;
cube[0, 0, 2] = 3;
cube[0, 1, 0] = 4;
cube[0, 1, 1] = 5;
cube[0, 1, 2] = 6;
cube[1, 0, 0] = 7;
cube[1, 0, 1] = 8;
cube[1, 0, 2] = 9;
cube[1, 1, 0] = 10;
cube[1, 1, 1] = 11;
cube[1, 1, 2] = 12;
// 使用数组初始化器
int[,,] cube2 = { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };
// 访问数组元素
Console.WriteLine(cube[0, 0, 0]); // 输出: 1
Console.WriteLine(cube2[1, 1, 2]); // 输出: 12
}
}
示例7:遍历三维数组
文件1:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
int[,,] cube = { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };
// 使用嵌套 for 循环遍历三维数组
for (int i = 0; i < cube.GetLength(0); i++)
{
for (int j = 0; j < cube.GetLength(1); j++)
{
for (int k = 0; k < cube.GetLength(2); k++)
{
Console.Write(cube[i, j, k] + " ");
}
Console.WriteLine();
}
Console.WriteLine();
}
}
}
通过以上详细讲解和代码示例,您可以更好地理解和使用C#中的多维数组。多维数组是存储和操作按多个维度组织的数据的重要数据结构,提供了快速访问和内存效率高的优点,但需要注意其固定大小和插入删除操作的性能开销。