1. 入门
通常我们想对数组做什么?
来列一下最基本的操作:
- 按索引读取和修改数组元素。
- 按值查找元素。
- 复制数组,创建“切片”(数组的一部分)。
- 数组排序。
- 数组反转(reverse)。
- 用某个值填充数组。
- 检查数组里是否有某个值。
- 改变数组长度(resize)。
在实际开发中你经常会遇到这些操作——比如,“有没有总和大于4000的?”,“找第一个低于1000的价格”,“把价格升序排序”等等。
这些操作都有现成的函数
| 操作 | 方法 / 语法 | 特点 |
|---|---|---|
| 按索引修改 | |
越界会报错 |
| 查找值 | |
找不到返回-1 |
| 检查是否存在 | |
lambda或函数 |
| 排序 | |
原地修改数组 |
| 反转 | |
改变元素顺序 |
| 复制 | |
浅拷贝 |
| 填充 | |
全部填同一个值 |
| 改变大小 | |
新元素是default |
| 找最大/最小 | |
需要Linq |
2. 按索引读取和修改元素
这个你肯定见过,但我们再用个简单例子巩固一下(假设有个成绩数组):
// 学生成绩数组
int[] grades = { 4, 3, 5, 2, 5 };
// 读取第一个成绩
int firstGrade = grades[0];
Console.WriteLine($"第一个成绩: {firstGrade}");
// 把最后一个成绩改成“优秀”(5)
grades[^1] = 5;
Console.WriteLine("修改后的最后成绩: " + grades[^1]);
注意:索引从0开始,访问不存在的索引会报IndexOutOfRangeException——面试和实际开发的经典问题。
3. 在数组中查找元素
有两个函数可以查找数组里的元素,找到就返回索引。
函数 Array.IndexOf(value [, from])
Array.IndexOf从头开始找指定元素。找到就返回索引,没找到就返回-1。
如果你想找下一个相同的元素,可以给Array.IndexOf传第二个参数——从哪个索引开始找。通常是上次找到的索引+1。
来找找数组里所有2出现的位置:
int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // 要找的元素
int index = Array.IndexOf(grades, x);
while (index != -1)
{
Console.WriteLine($"元素 {x} 出现在位置: {index}");
// 从index+1继续找下一个
index = Array.IndexOf(grades, x, index + 1);
}
函数 Array.LastIndexOf(value [, from])
Array.LastIndexOf从数组末尾开始找。找到就返回索引,没找到就返回-1。其他用法和Array.IndexOf一样。
来试试从后往前找2出现的位置:
int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // 要找的元素
int index = Array.LastIndexOf(grades, x);
while (index != -1)
{
Console.WriteLine($"元素 {x} 出现在位置: {index}");
// 从index-1继续往前找
index = Array.LastIndexOf(grades, x, index - 1);
}
4. 检查数组里是否有某个元素
要判断数组里有没有某个元素,可以用Contains。这个方法会返回true,如果数组里有你要找的元素。用它之前记得加上System.Linq模块。例子:
using System.Linq; // 没有的话加上using System.Linq;
bool hasExcellent = grades.Contains(5);
Console.WriteLine($"有5分吗?{hasExcellent}");
超级简单又优雅。
5. 反转数组:Array.Reverse
比如你想把数组“倒过来”。用这个方法就行:
int[] grades = { 2, 3, 4, 5 };
// 反转数组
Array.Reverse(grades);
Console.WriteLine("反转后的成绩: " + string.Join(", ", grades));
查找“最新”数据或者你就喜欢看世界倒着的,这个很方便。
6. 数组排序:Array.Sort
迟早你会想把数组排序。最简单最安全的办法就是用标准排序函数:
int[] grades = { 4, 3, 5, 2, 5 };
// 升序排序
Array.Sort(grades);
Console.WriteLine("升序排序后的成绩: " + string.Join(", ", grades));
这个函数也能排字符串,不过是按字母顺序。
降序排序
标准Array.Sort只能升序。如果要降序,可以先排序再反转:
Array.Sort(grades); // 先升序
Array.Reverse(grades); // 再反转
Console.WriteLine("降序: " + string.Join(", ", grades));
注意:很多人会忘了排序是“原地”的:数组本身会变,不会返回新数组。如果你要保留原顺序,先复制一份原数组。
7. 克隆数组:Clone 和 Array.Copy
如果你想复制一份(处理时不想动原数组),可以用Clone()和Array.Copy()。
Clone()是数组自带的方法,会返回完整的副本。
Array.Copy()需要你传参数:
- 源数组;
- 目标数组;
- 要复制多少个元素。
int[] original = { 1, 2, 3, 4, 5 };
// 方法1:Clone()
// 支持一维和多维数组,但返回object,需要类型转换:
int[] copy1 = (int[]) original.Clone();
// 方法2:Array.Copy
int[] copy2 = new int[original.Length];
Array.Copy(original, copy2, original.Length);
重要:如果是基础类型(int、double),数组是按值复制。如果是对象数组,只复制引用!(也就是“浅拷贝”)。
8. 用某个值填充数组:Array.Fill
想把数组“清零”或者全都填成5?用Array.Fill就很方便:
int[] grades = new int[5];
Array.Fill(grades, 5); // 现在所有元素都是5
Console.WriteLine("理论上最完美的学生: " + string.Join(", ", grades));
需要快速初始化数组时很有用。
9. 查找最大值和最小值
System.Linq模块给数组加了很多好用的方法,其中有两个能返回数组里的最大值和最小值,名字就是Max()和Min()。
来找找数组里的最大和最小成绩:
int maxGrade = grades.Max();
int minGrade = grades.Min();
Console.WriteLine($"最高成绩: {maxGrade}, 最低成绩: {minGrade}");
别忘了加上using System.Linq;才能用这些方法。
GO TO FULL VERSION