C# 数组(Array)详解
数组(Array)是 C# 中最常用的数据结构之一,它可以存储多个相同类型的数据,并使用**索引(Index)**来访问每个元素。
例如,一个班级有 50 名学生,如果不用数组,就需要定义 50 个变量:
string student1 = "张三"; string student2 = "李四"; string student3 = "王五";使用数组后,只需要一个变量:
string[] students = { "张三", "李四", "王五" };一、什么是数组
数组是一组相同数据类型元素的集合。
特点:
- 数据类型必须一致
- 大小固定(创建后不能改变长度)
- 连续存储
- 使用索引访问元素
- 索引从0开始
例如:
int[] nums = { 10, 20, 30, 40 };内存结构:
索引(Index) 0 1 2 3 ┌───┬───┬───┬───┐ │10 │20 │30 │40 │ └───┴───┴───┴───┘访问:
Console.WriteLine(nums[0]); //10 Console.WriteLine(nums[2]); //30二、声明数组
语法:
数据类型[] 数组名;例如:
int[] numbers; string[] names; double[] prices; bool[] flags;这里只是声明,没有分配内存。
三、创建数组
使用 new:
int[] numbers = new int[5];表示:
长度:5 索引: 0 1 2 3 4默认值:
0 0 0 0 0输出:
Console.WriteLine(numbers[0]);结果:
0四、初始化数组
方法一:先创建再赋值
int[] numbers = new int[3]; numbers[0] = 100; numbers[1] = 200; numbers[2] = 300;方法二:创建时初始化
int[] numbers = new int[] { 100, 200, 300 };方法三(最常用)
int[] numbers = { 100, 200, 300 };或者
int[] numbers = { 100, 200, 300 };五、访问数组元素
语法:
数组名[索引]例如:
string[] names = { "Tom", "Jack", "Lucy" }; Console.WriteLine(names[0]); Console.WriteLine(names[1]); Console.WriteLine(names[2]);输出:
Tom Jack Lucy六、修改数组元素
int[] score = { 80, 90, 70 }; score[1] = 100; Console.WriteLine(score[1]);输出:
100七、数组长度 Length
Length 表示数组元素数量。
int[] nums = { 10, 20, 30, 40 }; Console.WriteLine(nums.Length);输出:
4八、遍历数组
方法一:for(最常用)
int[] nums = { 10, 20, 30, 40 }; for (int i = 0; i < nums.Length; i++) { Console.WriteLine(nums[i]); }输出:
10 20 30 40为什么使用Length?
如果以后数组变成:
int[] nums = {1,2,3,4,5,6,7};循环无需修改。
方法二:foreach
int[] nums = { 10, 20, 30, 40 }; foreach (int item in nums) { Console.WriteLine(item); }输出:
10 20 30 40foreach 特点
优点:
- 简洁
- 不容易越界
- 推荐用于只读遍历
缺点:
不能修改元素。
错误示例:
foreach (int item in nums) { item = 100; //错误 }九、数组越界
例如:
int[] nums = { 1, 2, 3 }; Console.WriteLine(nums[3]);数组只有:
0 1 2访问:
3运行结果:
IndexOutOfRangeException即:
索引超出数组范围。
十、数组默认值
不同类型默认值不同。
| 类型 | 默认值 |
|---|---|
| int | 0 |
| double | 0 |
| bool | false |
| string | null |
| char | '\0' |
| object | null |
例如:
string[] names = new string[3]; Console.WriteLine(names[0] == null);输出:
True十一、数组排序
使用Array.Sort()
int[] nums = { 8, 2, 9, 1, 5 }; Array.Sort(nums); foreach (int i in nums) { Console.Write(i + " "); }输出:
1 2 5 8 9十二、数组反转
int[] nums = {1,2,3,4,5}; Array.Reverse(nums);输出:
5 4 3 2 1十三、查找元素
使用:
Array.IndexOf()例如:
int[] nums = {10,20,30,40}; int index = Array.IndexOf(nums,30); Console.WriteLine(index);输出:
2如果找不到:
Array.IndexOf(nums,100);输出:
-1十四、复制数组
int[] nums = {1,2,3}; int[] copy = new int[3]; Array.Copy(nums, copy, 3);结果:
copy 1 2 3十五、多维数组
二维数组:
int[,] matrix = { {1,2,3}, {4,5,6} };内存:
1 2 3 4 5 6访问:
Console.WriteLine(matrix[1,2]);输出:
6遍历:
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(); }输出:
1 2 3 4 5 6十六、交错数组(Jagged Array)
交错数组是数组中的每个元素仍然是一个数组,每一行长度可以不同。
int[][] jagged = { new int[]{1,2}, new int[]{3,4,5}, new int[]{6} };访问:
Console.WriteLine(jagged[1][2]);输出:
5二维数组与交错数组区别:
二维数组:
1 2 3 4 5 6 7 8 9交错数组:
1 2 3 4 5 6十七、数组作为参数
static void Print(int[] nums) { foreach (int n in nums) { Console.WriteLine(n); } }调用:
int[] arr = {1,2,3}; Print(arr);十八、数组作为返回值
static int[] GetNumbers() { return new int[] { 10, 20, 30 }; }调用:
int[] nums = GetNumbers();十九、params 参数(可变参数)
static int Sum(params int[] nums) { int total = 0; foreach (int i in nums) total += i; return total; }调用:
Console.WriteLine(Sum(1,2,3)); Console.WriteLine(Sum(1,2,3,4,5));输出:
6 15二十、数组与 List<T> 的区别
| 特性 | 数组(Array) | List<T> |
|---|---|---|
| 长度 | 固定 | 可动态扩容 |
| 增删元素 | 不方便 | 非常方便 |
| 性能 | 略高 | 略低(扩容时有开销) |
| 适用场景 | 元素数量固定 | 元素数量不确定 |
示例:
数组:
int[] nums = {1,2,3};List:
List<int> nums = new List<int>(); nums.Add(1); nums.Add(2); nums.Add(3);二十一、综合练习
示例:计算平均成绩
using System; class Program { static void Main() { int[] scores = { 88, 92, 75, 99, 81 }; int sum = 0; for (int i = 0; i < scores.Length; i++) { sum += scores[i]; } double average = (double)sum / scores.Length; Console.WriteLine($"总分:{sum}"); Console.WriteLine($"平均分:{average:F2}"); } }输出:
总分:435 平均分:87.00二十二、常见错误总结
| 错误 | 原因 | 正确做法 |
|---|---|---|
| 数组越界 | 索引超出范围 | 使用0 ~ Length - 1 |
| 未初始化数组 | 数组为null | 使用new创建数组 |
| 类型不一致 | 数组元素类型必须一致 | 使用统一的数据类型 |
修改foreach变量 | foreach变量是只读的 | 使用for修改元素 |
二十三、学习总结
- 数组(Array)是存储同一类型数据的固定长度集合。
- 使用索引(0 开始)快速访问元素,时间复杂度通常为O(1)。
- 使用
Length获取元素数量,遍历时推荐结合for或foreach。 - 常用静态方法包括:
Array.Sort()、Array.Reverse()、Array.IndexOf()、Array.Copy()。 - C# 支持一维数组、二维数组、多维数组和交错数组。
- 当数据数量固定时,数组是高效的选择;当需要频繁增删或动态扩容时,更推荐使用
List<T>。
