跳转到内容

C Sharp 交错数组

来自代码酷


C#交错数组(Jagged Array)是一种特殊的数组结构,它由多个一维数组组成,每个一维数组可以有不同的长度。与多维数组(如矩形数组)不同,交错数组的每一行可以独立定义大小,因此更灵活,适用于存储不规则的数据结构。

介绍[编辑 | 编辑源代码]

在C#中,交错数组是“数组的数组”,即一个数组的每个元素本身又是一个数组。这种结构允许每一行(或维度)拥有不同的长度,从而节省内存空间并提高效率。交错数组常用于处理非均匀数据,例如存储不同长度的字符串列表或表格数据。

与多维数组的区别[编辑 | 编辑源代码]

  • 多维数组(矩形数组):所有行具有相同的列数,例如 int[,] matrix = new int[3, 4]; 表示3行4列的固定结构。
  • 交错数组:每一行可以有不同的长度,例如 int[][] jagged = new int[3][]; 表示3行,但每行的列数可以动态分配。

声明与初始化[编辑 | 编辑源代码]

交错数组的声明和初始化分为两步: 1. 声明外层数组(行数)。 2. 为每一行分配独立的一维数组(列数)。

语法示例[编辑 | 编辑源代码]

// 声明一个交错数组(3行)
int[][] jaggedArray = new int[3][];

// 初始化每一行的列数
jaggedArray[0] = new int[] { 1, 2, 3 };       // 第0行有3列
jaggedArray[1] = new int[] { 4, 5 };           // 第1行有2列
jaggedArray[2] = new int[] { 6, 7, 8, 9 };     // 第2行有4列

可视化结构[编辑 | 编辑源代码]

graph TD A[jaggedArray] --> B[Row 0: 1, 2, 3] A --> C[Row 1: 4, 5] A --> D[Row 2: 6, 7, 8, 9]

访问元素[编辑 | 编辑源代码]

通过双重索引访问元素,例如 jaggedArray[行][列]

Console.WriteLine(jaggedArray[0][1]); // 输出: 2
Console.WriteLine(jaggedArray[2][3]); // 输出: 9

遍历交错数组[编辑 | 编辑源代码]

使用嵌套循环遍历所有元素:

for (int i = 0; i < jaggedArray.Length; i++)
{
    for (int j = 0; j < jaggedArray[i].Length; j++)
    {
        Console.Write(jaggedArray[i][j] + " ");
    }
    Console.WriteLine();
}
// 输出:
// 1 2 3
// 4 5
// 6 7 8 9

实际应用案例[编辑 | 编辑源代码]

案例1:存储学生成绩[编辑 | 编辑源代码]

假设不同学生参加的考试科目数量不同,使用交错数组存储成绩:

string[][] studentScores = new string[2][];
studentScores[0] = new string[] { "Alice", "Math:90", "Science:85" };
studentScores[1] = new string[] { "Bob", "Math:75", "History:88", "Art:92" };

foreach (var student in studentScores)
{
    Console.WriteLine($"Student: {student[0]}");
    for (int i = 1; i < student.Length; i++)
    {
        Console.WriteLine($"  - {student[i]}");
    }
}

案例2:图像处理中的像素块[编辑 | 编辑源代码]

在图像处理中,不同区域的像素块大小可能不同:

byte[][] imageBlocks = new byte[3][];
imageBlocks[0] = new byte[] { 255, 0, 0 };    // 红色块
imageBlocks[1] = new byte[] { 0, 255, 0, 0 }; // 绿色块(带透明度)
imageBlocks[2] = new byte[] { 0, 0, 255 };    // 蓝色块

高级用法[编辑 | 编辑源代码]

动态调整行长度[编辑 | 编辑源代码]

可以随时为某一行重新分配数组:

jaggedArray[1] = new int[] { 10, 20, 30, 40, 50 }; // 修改第1行

结合LINQ查询[编辑 | 编辑源代码]

使用LINQ过滤或转换数据:

var evenNumbers = jaggedArray.SelectMany(row => row.Where(n => n % 2 == 0));
// 输出所有偶数: 2, 4, 6, 8

性能与内存考虑[编辑 | 编辑源代码]

  • 优点:节省内存(仅分配实际需要的空间)。
  • 缺点:访问速度略慢于多维数组(需多次解引用)。

总结[编辑 | 编辑源代码]

交错数组是C#中处理不规则数据的强大工具,尤其适合动态变化的场景。初学者应掌握其声明、初始化和遍历方法,而高级用户可结合LINQ或动态分配优化应用逻辑。