首页
看点啥
插画图片
首页 科技看点 深入理解C#交错数组的用法与实践示例实用指南

深入理解C#交错数组的用法与实践示例实用指南

2026-10-09 0

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“深入理解C#交错数组的用法与实践示例”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

一、什么是交错数组?

在这个场景下,交错数组(Jagged Array)是C#中一种特殊的数组类型,它本质上是“数组的数组”。与规则的多维数组不同,交错数组的每个元素本身又是一个数组,同时且这些子数组的长度能够各不相同。

二、交错数组与多维数组的区别

为便于更好地理解交错数组,我们先对比一下它与规则多维数组的区别:

特性交错数组多维数组
声明语法int[][] jaggedArray;int[,] multiArray;
内存结构每个子数组独立分配内存连续内存块
子数组长度能够不同必须相同
访问性能稍慢(需两次寻址)稍快(连续内存)
适用场景不规则数据、稀疏矩阵规则表格数据

三、交错数组的基本用法

3.1 声明与初始化

交错数组的声明和初始化有多种方式:

// 方式1:声明后逐个初始化
int[][] jaggedArray1 = new int[3][];
jaggedArray1[0] = new int[] { 1, 2, 3 };
jaggedArray1[1] = new int[] { 4, 5 };
jaggedArray1[2] = new int[] { 6, 7, 8, 9 };

// 方式2:声明时直接初始化
int[][] jaggedArray2 = new int[][]
{
    new int[] { 1, 2, 3 },
    new int[] { 4, 5 },
    new int[] { 6, 7, 8, 9 }
};

// 方式3:使用简化语法(C# 3.0+)
int[][] jaggedArray3 =
{
    new[] { 1, 2, 3 },
    new[] { 4, 5 },
    new[] { 6, 7, 8, 9 }
};

3.2 访问元素

落到代码里,访问交错数组元素需两个索引:第一个索引选择子数组,第二个索引选择子数组中的元素。

int[][] jaggedArray = 
{
    new[] { 1, 2, 3 },
    new[] { 4, 5 },
    new[] { 6, 7, 8, 9 }
};

// 访问第一个子数组的第二个元素
int element = jaggedArray[0][1]; // 值为2

// 修改第二个子数组的第一个元素
jaggedArray[1][0] = 10; // 现在第二个子数组是 {10, 5}

// 获取子数组的长度
int length1 = jaggedArray[0].Length; // 3
int length2 = jaggedArray[1].Length; // 2
int length3 = jaggedArray[2].Length; // 4

3.3 遍历交错数组

遍历交错数组通常需嵌套循环:

int[][] jaggedArray = 
{
    new[] { 1, 2, 3 },
    new[] { 4, 5 },
    new[] { 6, 7, 8, 9 }
};

// 使用for循环
for (int i = 0; i < jaggedArray.Length; i++)
{
    for (int j = 0; j < jaggedArray[i].Length; j++)
    {
        Console.Write(jaggedArray[i][j] + " ");
    }
    Console.WriteLine();
}

// 使用foreach循环(更简洁)
foreach (int[] subArray in jaggedArray)
{
    foreach (int element in subArray)
    {
        Console.Write(element + " ");
    }
    Console.WriteLine();
}

四、交错数组的实战应用

4.1 存储不规则数据

交错数组很适合存储长度不一致的数据,比如学生成绩表:

// 存储不同学生不同数量的成绩
string[][] studentScores =
{
    new[] { "张三", "85", "90", "78" }, // 3门成绩
    new[] { "李四", "92", "88" }, // 2门成绩
    new[] { "王五", "76", "85", "91", "82" } // 4门成绩
};

// 计算每个学生的平均分
foreach (string[] student in studentScores)
{
    string name = student[0];
    double sum = 0;
    
    for (int i = 1; i < student.Length; i++)
    {
        sum += double.Parse(student[i]);
    }
    
    double average = sum / (student.Length - 1);
    Console.WriteLine($"{name}的平均分:{average:F2}");
}

4.2 实现稀疏矩阵

对于大部分元素为0的稀疏矩阵,采用交错数组能够节省内存:

// 创建一个10x10的稀疏矩阵,只有少数位置有值
int?[][] sparseMatrix = new int?[10][];

// 初始化所有行为null(表示全0)
for (int i = 0; i < 10; i++)
{
    sparseMatrix[i] = null;
}

// 只在特定位置存储非零值
sparseMatrix[2] = new int?[10];
sparseMatrix[2][3] = 5; // 第3行第4列值为5

sparseMatrix[5] = new int?[10];
sparseMatrix[5][7] = 8; // 第6行第8列值为8
sparseMatrix[5][9] = 3; // 第6行第10列值为3

// 访问矩阵元素(null表示0)
int? GetValue(int row, int col)
{
    return sparseMatrix[row]?[col] ?? 0;
}

Console.WriteLine(GetValue(2, 3)); // 输出:5
Console.WriteLine(GetValue(0, 0)); // 输出:0(null)

4.3 构建树形结构数据

交错数组能够模拟轻松的树形结构:

// 表示一个公司的部门结构
string[][] companyStructure =
{
    new[] { "总部" },
    new[] { "总部", "技术部", "开发组", "测试组", "运维组" },
    new[] { "总部", "市场部", "推广组", "策划组" },
    new[] { "总部", "人事部", "招聘组", "培训组", "薪酬组", "员工关系组" }
};

// 打印组织结构
foreach (string[] departmentPath in companyStructure)
{
    string indent = new string(' ', (departmentPath.Length - 1) * 2);
    Console.WriteLine(indent + departmentPath[^1]);
}

五、高级技巧与注意事项

5.1 性能优化建议

  • 预分配内存:如果知道子数组的大致长度,能够预先分配:
int[][] jaggedArray = new int[1000][];
for (int i = 0; i < jaggedArray.Length; i++)
{
    jaggedArray[i] = new int[50]; // 预分配50个元素
}
  • 避免频繁重新分配:如果需调整子数组大小,考虑采用List代替
  • 缓存长度:在循环中缓存子数组长度能够提高性能:
for (int i = 0; i < jaggedArray.Length; i++)
{
    int[] subArray = jaggedArray[i];
    int length = subArray.Length; // 缓存长度
    
    for (int j = 0; j < length; j++)
    {
        // 处理元素
    }
}

5.2 常用错误与调试

  1. 空引用异常:忘记初始化子数组
int[][] jaggedArray = new int[3][];
// jaggedArray[0] 为 null,访问会抛出 NullReferenceException
// Console.WriteLine(jaggedArray[0][0]); // 错误!

// 正确的做法
jaggedArray[0] = new int[5];
Console.WriteLine(jaggedArray[0][0]); // 正确,输出0
  1. 索引越界:访问不存在的子数组索引
int[][] jaggedArray = { new[] { 1, 2, 3 } };
// Console.WriteLine(jaggedArray[1][0]); // 错误!只有jaggedArray[0]

// 安全的访问方式
if (jaggedArray.Length > 1 && jaggedArray[1] != null)
{
    Console.WriteLine(jaggedArray[1][0]);
}

5.3 与List>的对比

特性交错数组List>
性能访问稍快插入删除更快
内存更紧凑有额外开销
灵活性固定大小动态大小
线程安全不是不是
适用场景数据不变或很少变需频繁增删

六、总结

实际处理时,交错数组是C#中处理不规则数据的强大工具,它提供了比规则多维数组更大的灵活性。关键要点:

  • 交错数组是"数组的数组",每个子数组长度能够不同
  • 适用来存储不规则数据、稀疏矩阵和树形结构
  • 访问元素需两个索引:jaggedArray[i][j]
  • 注意空引用和索引越界问题
  • 在性能和灵活性之间权衡,必要时考虑List>

掌握交错数组的采用,能让你的C#代码在处理复杂数据结构时更加得心应手。

在这个场景下,总的来说,C#交错数组适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。

喜欢(0)

上一篇

Git SSH配置教程:如何生成公钥并添加GitLab实用指南

Git SSH配置教程:如何生成公钥并添加GitLab实用指南

下一篇

Mysql数据库索引下推完整代码示例实用指南

猜你喜欢