C#数组完全指南:从基础到多维数组解析

🧱 一、数组的本质

数组是用单个变量名管理的一组同类型数据元素,通过索引访问元素:

csharp 复制代码
myArray[4]  // 访问索引为4的元素 
  • 元素:数组中的独立数据项(必须同类型)
  • 秩/维度:数组的维度数量(如二维数组秩=2)
  • 维度长度:单维度中的位置数量
  • 数组长度:所有维度元素总数

⚠️ 二、关键特性

固定大小

数组创建后长度不可变(C#不支持动态数组)

索引规则

  • 索引从0开始
  • 维度长度为n时,索引范围:0 → n-1
  • 示例:长度为6的数组,有效索引为0~5

🔢 三、数组类型对比

类型 特点 语法 适用场景
一维数组 int[] arr = new int[5]; 线性数据存储 每维度子数组长度相同
矩形数组 每维度子数组长度相同 arr[2,3] arr[2,3]
交错数组 子数组可独立定义长度 arr[1][0] 不规则数据(如锯齿状)
复制代码
 |

🔄 四、多维数组详解

矩形数组(Rectangular Array)

csharp 复制代码
int[,] rectArray = new int[3,4]; // 3行4列的固定矩阵
int x = rectArray[2,3]; // 访问第3行第4列(单组方括号)所有维度子数组长度强制一致
内存连续存储

交错数组(Jagged Array)

csharp 复制代码
int[][] jagArray = new int[3][]; 
jagArray[0] = new int[4]; // 第一行4列 
jagArray[1] = new int[2]; // 第二行2列(长度可变!)
int y = jagArray[1][0];   // 多组方括号 
  • 本质是"数组的数组"
  • 每个子数组可独立指定长度

💎 五、核心设计原则

性能取舍

  • 矩形数组:内存连续,访问更快
  • 交错数组:灵活但内存碎片风险

选择建议

  • 数学计算/表格处理 → 矩形数组
  • JSON等不规则数据 → 交错数组
    安全陷阱
csharp 复制代码
int[,] arr = new int[5,5];
arr[5,0] = 1; // 抛出IndexOutOfRangeException!

最佳实践:初始化时校验维度长度

csharp 复制代码
if (i < arr.GetLength(0) && j < arr.GetLength(1)) 
{ 
    arr[i,j] = value; 
}

📚 六、延伸思考

虽然C#数组大小固定,但可通过:

Array.Resize() 创建新数组复制数据(有性能损耗)

使用 List 动态集合类型

内存优化:对超大数组用 Buffer.BlockCopy()

相关推荐
仙俊红9 小时前
LeetCode487周赛T2,删除子数组后的最终元素
数据结构·算法
-dzk-15 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
风筝在晴天搁浅16 小时前
hot100 78.子集
java·算法
Jasmine_llq16 小时前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪16 小时前
快速进制转换
笔记·算法
m0_7066532316 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你9116 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
qq_4232339017 小时前
C++与Python混合编程实战
开发语言·c++·算法
TracyCoder12317 小时前
LeetCode Hot100(19/100)——206. 反转链表
算法·leetcode
m0_7155753417 小时前
分布式任务调度系统
开发语言·c++·算法