CodeGym /课程 /C# SELF /C#一维数组的基本操作

C#一维数组的基本操作

C# SELF
第 7 级 , 课程 3
可用

1. 入门

通常我们想对数组做什么?

来列一下最基本的操作:

  • 按索引读取和修改数组元素。
  • 按值查找元素。
  • 复制数组,创建“切片”(数组的一部分)。
  • 数组排序。
  • 数组反转(reverse)。
  • 用某个值填充数组。
  • 检查数组里是否有某个值。
  • 改变数组长度(resize)。

在实际开发中你经常会遇到这些操作——比如,“有没有总和大于4000的?”,“找第一个低于1000的价格”,“把价格升序排序”等等。

这些操作都有现成的函数

操作 方法 / 语法 特点
按索引修改
arr[n] = x
越界会报错
查找值
Array.IndexOf(arr, v)
找不到返回-1
检查是否存在
Array.Exists(arr, pred)
lambda或函数
排序
Array.Sort(arr)
原地修改数组
反转
Array.Reverse(arr)
改变元素顺序
复制
arr.Clone(), Array.Copy
浅拷贝
填充
Array.Fill(arr, val)
全部填同一个值
改变大小
Array.Resize(ref arr, len)
新元素是default
找最大/最小
arr.Max(), arr.Min()
需要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.IndexOf查找所有元素出现的位置

函数 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);
}
Array.LastIndexOf从后往前查找所有元素出现的位置

4. 检查数组里是否有某个元素

要判断数组里有没有某个元素,可以用Contains。这个方法会返回true,如果数组里有你要找的元素。用它之前记得加上System.Linq模块。例子:

using System.Linq; // 没有的话加上using System.Linq;

bool hasExcellent = grades.Contains(5); 
Console.WriteLine($"有5分吗?{hasExcellent}");
Contains检查数组里是否有某个值

超级简单又优雅。

5. 反转数组:Array.Reverse

比如你想把数组“倒过来”。用这个方法就行:

int[] grades = { 2, 3, 4, 5 };

// 反转数组
Array.Reverse(grades);
Console.WriteLine("反转后的成绩: " + string.Join(", ", grades));
Array.Reverse反转数组

查找“最新”数据或者你就喜欢看世界倒着的,这个很方便。

6. 数组排序:Array.Sort

迟早你会想把数组排序。最简单最安全的办法就是用标准排序函数:

int[] grades = { 4, 3, 5, 2, 5 };
// 升序排序
Array.Sort(grades);
Console.WriteLine("升序排序后的成绩: " + string.Join(", ", grades));
Array.Sort升序排序数组

这个函数也能排字符串,不过是按字母顺序。

降序排序

标准Array.Sort只能升序。如果要降序,可以先排序再反转:

Array.Sort(grades); // 先升序
Array.Reverse(grades); // 再反转
Console.WriteLine("降序: " + string.Join(", ", grades));
降序排序: Sort + Reverse

注意:很多人会忘了排序是“原地”的:数组本身会变,不会返回新数组。如果你要保留原顺序,先复制一份原数组。

7. 克隆数组:CloneArray.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);
克隆数组: Clone()Array.Copy()

重要:如果是基础类型(intdouble),数组是按值复制。如果是对象数组,只复制引用!(也就是“浅拷贝”)。

8. 用某个值填充数组:Array.Fill

想把数组“清零”或者全都填成5?用Array.Fill就很方便:

int[] grades = new int[5];
Array.Fill(grades, 5); // 现在所有元素都是5
Console.WriteLine("理论上最完美的学生: " + string.Join(", ", grades));
Array.Fill填充数组

需要快速初始化数组时很有用。

9. 查找最大值和最小值

System.Linq模块给数组加了很多好用的方法,其中有两个能返回数组里的最大值和最小值,名字就是Max()Min()

来找找数组里的最大和最小成绩:

int maxGrade = grades.Max();
int minGrade = grades.Min();
Console.WriteLine($"最高成绩: {maxGrade}, 最低成绩: {minGrade}");
查找数组里的最大值和最小值

别忘了加上using System.Linq;才能用这些方法。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION