C# 数组(Array)
下面是从专业开发角度出发、基于 Microsoft 官方文档 的 C# 数组(Array) 全面详解,涵盖概念、声明、初始化、使用方式、多维与交错数组、常用方法与技巧,并附有多种途径示例。
一、什么是数组?
数组(Array) 是一种数据结构,用于存储 固定大小、同一类型 的元素集合。元素在内存中是连续排列的,可通过索引访问。
二、数组的声明方式
1. 声明但不初始化
int[] numbers; // 声明一个整型数组变量
2. 声明并指定大小
int[] numbers = new int[5]; // 声明并分配5个整数元素
3. 声明并初始化
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
4. 类型推断(推荐)
var numbers = new[] { 1, 2, 3, 4 }; // 自动推断为 int[]
三、访问与修改数组元素
int[] nums = { 10, 20, 30 };
Console.WriteLine(nums[1]); // 输出 20
nums[2] = 100;
Console.WriteLine(nums[2]); // 输出 100
注意:索引从
0开始,超出范围访问将抛出IndexOutOfRangeException
四、数组的遍历方式
1. for 循环
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i]);
}
2. foreach 循环
foreach (int n in nums)
{
Console.WriteLine(n);
}
五、多维数组(Multi-dimensional Arrays)
1. 二维数组
int[,] matrix = new int[2, 3]; // 2行3列
int[,] matrix2 = {
{ 1, 2, 3 },
{ 4, 5, 6 }
};
Console.WriteLine(matrix2[1, 2]); // 输出 6
六、交错数组(Jagged Arrays)= 数组的数组
int[][] jagged = new int[2][];
jagged[0] = new int[] { 1, 2 };
jagged[1] = new int[] { 3, 4, 5 };
Console.WriteLine(jagged[1][2]); // 输出 5
七、常用属性和方法(Array 类)
| 方法/属性 | 描述 |
|---|---|
Length | 获取数组的元素总数 |
Rank | 获取维数(几维数组) |
Array.Sort() | 对数组排序 |
Array.Reverse() | 反转数组中的元素 |
Array.IndexOf() | 查找元素索引 |
Array.Clear() | 清空数组元素(设置为默认值) |
示例:
int[] arr = { 3, 1, 4 };
Array.Sort(arr); // arr: [1, 3, 4]
Array.Reverse(arr); // arr: [4, 3, 1]
Console.WriteLine(arr.Length); // 3
八、数组与内存管理
数组是 引用类型,即使是 int[] 这样的数组,其对象是分配在 托管堆 上。
⚠️ 数组大小一旦声明,不可改变。要实现动态扩容,推荐使用
List<T>。
九、数组与 List<T> 比较
| 特性 | 数组 T[] | List(泛型列表) |
|---|---|---|
| 大小可变 | ❌ 否 | ✅ 是 |
| 类型安全 | ✅ 是 | ✅ 是 |
| 内存效率 | ✅ 高 | ⚠️ 略低于数组 |
| 灵活操作 | ❌ 少方法支持 | ✅ Add/Remove/Sort 等 |
| 推荐使用 | 高性能/定长数据 | 灵活/数据不固定场景 |
十、实战示例:统计数字出现频率
int[] scores = { 100, 90, 80, 100, 90 };
Dictionary<int, int> freq = new Dictionary<int, int>();
foreach (int score in scores)
{
if (!freq.ContainsKey(score))
freq[score] = 0;
freq[score]++;
}
foreach (var pair in freq)
{
Console.WriteLine($"Score {pair.Key}: {pair.Value} times");
}
十一、官方文档链接
十二、最佳实践建议
| 建议 | 原因 |
|---|---|
| ✅ 对于定长数据使用数组 | 性能更优、内存连续 |
| ✅ 多维数组用于矩阵等结构化数据 | 代码语义更清晰 |
❌ 不建议频繁使用 Array.Resize | 实际会分配新数组,不是真正扩容 |
✅ 优先使用 List<T> 处理动态或用户输入长度数据 | 灵活、支持泛型操作、代码更简洁 |
更多详细内容,请关注其他相关文章!