Array.Sort()¶
以下是各题的 C# 代码实现和输出结果:
1. 整数数组升序排序¶
int[] numbers1 = { 9, 4, 2, 7, 1 };
Array.Sort(numbers1);
Console.WriteLine(string.Join(", ", numbers1)); // 输出: 1, 2, 4, 7, 9
2. 字符串数组字典顺序排序¶
string[] fruits = { "banana", "apple", "cherry" };
Array.Sort(fruits);
Console.WriteLine(string.Join(", ", fruits)); // 输出: apple, banana, cherry
3. 对指定范围的元素排序¶
int[] numbers2 = { 5, 9, 2, 7, 6, 1 };
// 从索引 1(第2个元素)开始,连续3个元素
Array.Sort(numbers2, 1, 3);
Console.WriteLine(string.Join(", ", numbers2)); // 输出: 5, 2, 7, 9, 6, 1
// 注意:只对 9, 2, 7 排序,结果为 2, 7, 9
4. 对最后三个元素使用区间排序¶
int[] numbers3 = { 100, 50, 200, 30, 10 };
// 方法1:使用范围运算符(C# 8.0+)
Array.Sort(numbers3[^3..]); // 对最后三个元素排序
Console.WriteLine(string.Join(", ", numbers3)); // 输出: 100, 50, 10, 30, 200
// 方法2:使用传统方式
int[] numbers3b = { 100, 50, 200, 30, 10 };
Array.Sort(numbers3b, numbers3b.Length - 3, 3);
Console.WriteLine(string.Join(", ", numbers3b)); // 输出: 100, 50, 10, 30, 200
5. 对中间3个元素排序,再整体倒序输出¶
string[] animals = { "dog", "cat", "apple", "zebra", "bat" };
// 对中间3个元素(索引1-3)排序
Array.Sort(animals, 1, 3); // 排序 "cat", "apple", "zebra"
Console.WriteLine("排序后数组: " + string.Join(", ", animals));
// 输出: dog, apple, cat, zebra, bat
// 整体倒序输出
Array.Reverse(animals);
Console.WriteLine("倒序输出: " + string.Join(", ", animals));
// 输出: bat, zebra, cat, apple, dog
6. 浮点数组升序排序¶
double[] floats = { 3.1, 2.4, 5.6, 1.2 };
Array.Sort(floats);
Console.WriteLine(string.Join(", ", floats)); // 输出: 1.2, 2.4, 3.1, 5.6
// 题 1:升序排序整数数组
int[] arr1 = { 9, 4, 2, 7, 1 };
Array.Sort(arr1);
Console.WriteLine("题1: " + string.Join(", ", arr1));
// 题 2:按字典顺序排序字符串数组
string[] arr2 = { "banana", "apple", "cherry" };
Array.Sort(arr2);
Console.WriteLine("题2: " + string.Join(", ", arr2));
// 题 3:升序后再倒序(降序)
int[] arr3 = { 10, 2, 8, 5, 3 };
Array.Sort(arr3);
Array.Reverse(arr3);
Console.WriteLine("题3: " + string.Join(", ", arr3));
// 题 4:区间排序部分数组
int[] arr4 = { 5, 9, 2, 7, 6, 1 };
Array.Sort(arr4, 1, 3); // 排序元素9,2,7
Console.WriteLine("题4: " + string.Join(", ", arr4));
// 题 5:最后三个元素排序
int[] arr5 = { 100, 50, 200, 30, 10 };
Array.Sort(arr5, 2, 3); // 200, 30, 10
Console.WriteLine("题5: " + string.Join(", ", arr5));
// 题 6:中间三个字符串排序+整体倒序
string[] arr6 = { "dog", "cat", "apple", "zebra", "bat" };
Array.Sort(arr6, 1, 3); // cat, apple, zebra
Array.Reverse(arr6);
Console.WriteLine("题6: " + string.Join(", ", arr6));
// 题 7:浮点数排序
double[] arr7 = { 3.1, 2.4, 5.6, 1.2 };
Array.Sort(arr7);
Console.WriteLine("题7: " + string.Join(", ", arr7));
// 题 8:先升序再降序
int[] arr8 = { 5, 4, 3, 2, 1 };
Array.Sort(arr8);
Console.WriteLine("题8-升序: " + string.Join(", ", arr8));
Array.Reverse(arr8);
Console.WriteLine("题8-降序: " + string.Join(", ", arr8));
// 题 9:仅对中间部分排序
int[] arr9 = { 8, 3, 7, 9, 2, 6 };
Array.Sort(arr9, 1, 4); // 3, 7, 9, 2 => 2,3,7,9
Console.WriteLine("题9: " + string.Join(", ", arr9));
// 题 10:字符串排序后倒序
string[] arr10 = { "Sun", "Earth", "Mars", "Venus" };
Array.Sort(arr10);
Array.Reverse(arr10);
Console.WriteLine("题10: " + string.Join(", ", arr10));
Array.Reverse()¶
- 将数组
{ 10, 2, 8, 5, 3 }使用Array.Sort()排序后,再使用Array.Reverse()实现降序排序。 - 将数组
{ 5, 4, 3, 2, 1 }通过排序和反转的方式变为{1, 2, 3, 4, 5},再变为{5, 4, 3, 2, 1}。 - 对字符串数组
{ "Sun", "Earth", "Mars", "Venus" }使用Array.Sort()排序,再用Array.Reverse()实现降序排序。
Array.IndexOf()¶
// 查找方法示例
int[] numbers = { 1, 3, 5, 7, 9, 5, 3 };
int index = Array.IndexOf(numbers, 5); // 返回 2
int lastIndex = Array.LastIndexOf(numbers, 5); // 返回 5
Array.Find()¶
Array.Exists()¶
Array.ForEach()¶
Array.Copy()¶
// 复制操作示例
int[] source = { 1, 2, 3, 4, 5 };
int[] dest = new int[5];
Array.Copy(source, dest, 3); // dest前3个元素变为 {1, 2, 3}
练习:中级题(15 道)¶
- 对一个整数数组先升序排序(
Sort()),再倒序(Reverse()),实现降序排列。 - 给定一个数组
[1, 3, 5, 3, 1],找出值为3的第一个和最后一个索引。 - 用
Find()找出数组[11, 22, 33, 44]中第一个能被 11 整除的元素。 - 在数组
[3, 6, 9, 12]中找出所有能被 6 整除的数(FindAll())。 - 判断数组
[-2, -4, -6, -8]是否所有值都是负数(TrueForAll())。 - 给定字符串数组
["apple", "banana", "cherry", "apricot"],找出所有以 "a" 开头的元素。 - 写一段代码判断数组是否已按升序排列(提示:配合
Sort()和SequenceEqual())。 - 找出数组中第一个值为奇数且大于 10 的元素。
- 编写一个方法,接受任意整数数组,返回所有偶数元素组成的新数组(使用
FindAll())。 - 给定数组
[1, 2, 3, 4, 5],使用Reverse()和IndexOf()找出原来倒数第二个元素现在的新索引。 - 查找数组
[2, 4, 6, 8]中不存在的值7的索引,并处理结果避免错误输出。 - 给定数组
[100, 90, 80, 70, 60],不使用Sort(),而是先Reverse()再判断是否降序排列。 -
使用
Exists()判断字符串数组中是否有空字符串""。 -
综合题:定义一个整数数组,输出其中所有能被 3 整除但不能被 5 整除的元素(使用
FindAll())。
/// 1. Sort + Reverse (降序)
int[] arr1 = { 7, 2, 9 };
Array.Sort(arr1);
Array.Reverse(arr1);
// 2. IndexOf & LastIndexOf
int[] arr2 = { 1, 3, 5, 3, 1 };
int first3 = Array.IndexOf(arr2, 3);
int last3 = Array.LastIndexOf(arr2, 3);
// 3. Find divisible by 11
int[] arr3 = { 11, 22, 33, 44 };
int firstDiv11 = Array.Find(arr3, n => n % 11 == 0);
// 4. FindAll divisible by 6
int[] arr4 = { 3, 6, 9, 12 };
int[] div6 = Array.FindAll(arr4, n => n % 6 == 0);
// 5. All negative
int[] arr5 = { -2, -4, -6, -8 };
bool allNegative = Array.TrueForAll(arr5, n => n < 0);
// 6. FindAll starts with 'a'
string[] fruits = { "apple", "banana", "cherry", "apricot" };
string[] startsA = Array.FindAll(fruits, f => f.StartsWith("a"));
// 7. Check if sorted ascending
int[] arr6 = { 1, 2, 3, 4 };
int[] sorted = (int[])arr6.Clone();
Array.Sort(sorted);
bool isSorted = arr6.SequenceEqual(sorted);
// 8. Find odd > 10
int[] arr7 = { 3, 8, 11, 13 };
int res1 = Array.Find(arr7, x => x % 2 == 1 && x > 10);
// 9. Method return even numbers
int[] EvenOnly(int[] input) => Array.FindAll(input, n => n % 2 == 0);
// 10. Reverse and find original 2nd-last index
int[] arr8 = { 1, 2, 3, 4, 5 };
int original = arr8[arr8.Length - 2];
Array.Reverse(arr8);
int newIndex = Array.IndexOf(arr8, original);
// 1. Not found IndexOf
int[] arr9 = { 2, 4, 6, 8 };
int idx = Array.IndexOf(arr9, 7); // -1
// 12. Check descending after reverse
int[] arr10 = { 100, 90, 80, 70, 60 };
Array.Reverse(arr10);
bool isDesc = arr10.SequenceEqual(arr10.OrderByDescending(x => x).ToArray());
// 13. Exists empty string
string[] strArr = { "hello", "", "world" };
bool hasEmpty = Array.Exists(strArr, s => s == "");
// 14. All strings length > 0
bool allNonEmpty = Array.TrueForAll(strArr, s => s.Length > 0);
// 15. FindAll: %3==0 and %5!=0
int[] arr11 = { 3, 5, 6, 9, 10, 12, 15 };
int[] res2 = Array.FindAll(arr11, x => x % 3 == 0 && x % 5 != 0);
练习:基础¶
// 示例:题1 - 打印固定数组
int[] arr1 = {1, 2, 3, 4, 5};
Console.WriteLine(string.Join(" ", arr1));
// 示例:题2 - 字符串数组访问
string[] cities = {"北京", "上海", "广州"};
Console.WriteLine(cities[0] + " " + cities[2]);
// 示例:题3 - 输入5个整数
int[] arr3 = new int[5];
for (int i = 0; i < 5; i++)
arr3[i] = int.Parse(Console.ReadLine());
Console.WriteLine(string.Join(" ", arr3));
// 示例:题4 - 找最大值
int[] arr4 = {4, 1, 9, 3, 5};
Console.WriteLine(arr4.Max());
// 示例:题5 - 求平均值
int[] arr5 = {4, 6, 8, 10, 12};
Console.WriteLine(arr5.Average());
// 示例:题6 - 求和
int[] arr6 = {3, 5, 7, 2, 8};
Console.WriteLine(arr6.Sum());
// 示例:题7 - 所有元素乘2
int[] arr7 = arr6.Select(x => x * 2).ToArray();
Console.WriteLine(string.Join(" ", arr7));
// 示例:题8 - 查找元素
int find8 = 5;
Console.WriteLine(arr6.Contains(find8));
// 示例:题9 - 找第一个负数
int[] arr9 = {2, -3, 4, -1};
Console.WriteLine(arr9.First(x => x < 0));
// 示例:题10 - 统计正数
Console.WriteLine(arr9.Count(x => x > 0));
// 示例:题11 - 反转
Array.Reverse(arr9);
Console.WriteLine(string.Join(" ", arr9));
// 示例:题12 - 数组复制
int[] copy12 = new int[arr9.Length];
Array.Copy(arr9, copy12, arr9.Length);
Console.WriteLine(string.Join(" ", copy12));
// 示例:题13 - 判断是否为空
int[] arr13 = new int[0];
Console.WriteLine(arr13.Length == 0);
// 示例:题14 - 输出指定索引
int idx14 = 2;
Console.WriteLine(idx14 < arr6.Length ? arr6[idx14].ToString() : "索引越界");
// 示例:题15 - 打印大写字母
char[] arr15 = {'A','b','C','d'};
foreach (char c in arr15) if (char.IsUpper(c)) Console.Write(c + " ");
练习:进阶¶
// 示例:题1 - 排序
Array.Sort(arr6);
Console.WriteLine(string.Join(" ", arr6));
// 示例:题2 - 反转
Array.Reverse(arr6);
Console.WriteLine(string.Join(" ", arr6));
// 示例:题3 - 输入10个数找最大最小
int[] arr18 = new int[10];
for (int i = 0; i < 10; i++) arr18[i] = int.Parse(Console.ReadLine());
Console.WriteLine($"Max: {arr18.Max()} Min: {arr18.Min()}");
// 示例:题4 - 全部偶数?
Console.WriteLine(Array.TrueForAll(arr6, x => x % 2 == 0));
// 示例:题5 - 提取偶数
int[] evens20 = Array.FindAll(arr6, x => x % 2 == 0);
Console.WriteLine(string.Join(" ", evens20));
// 示例:题6 - 合并数组
int[] arr21a = {1,2}, arr21b = {3,4};
int[] merged21 = arr21a.Concat(arr21b).ToArray();
Console.WriteLine(string.Join(" ", merged21));
// 示例:题7 - 删除元素(5)
int[] arr22 = {1,5,3,5,4};
arr22 = arr22.Where(x => x != 5).ToArray();
Console.WriteLine(string.Join(" ", arr22));
// 示例:题8 - 有重复元素?
int[] arr23 = {1,2,3,1};
Console.WriteLine(arr23.Length != arr23.Distinct().Count());
// 示例:题9 - 大于平均数
double avg24 = arr6.Average();
Console.WriteLine(string.Join(" ", arr6.Where(x => x > avg24)));
// 示例:题10 - Find第一个被3整除
Console.WriteLine(Array.Find(arr6, x => x % 3 == 0));
// 示例:题11 - FindAll被5整除
Console.WriteLine(string.Join(" ", Array.FindAll(arr6, x => x % 5 == 0)));
// 示例:题12 - IndexOf
Console.WriteLine(Array.IndexOf(arr6, 8));
// 示例:题13 - 负数替换为0
int[] arr28 = {-1,2,-3};
arr28 = arr28.Select(x => x < 0 ? 0 : x).ToArray();
Console.WriteLine(string.Join(" ", arr28));
// 示例:题14 - 元素次数统计
int[] arr29 = {1,2,1,3};
Console.WriteLine(arr29.Count(x => x == 1));
// 示例:题15 - 去重
int[] arr30 = {1,2,2,3,3};
Console.WriteLine(string.Join(" ", arr30.Distinct()));
// 示例:题16 - 比较数组是否相等
int[] a31 = {1,2,3}, b31 = {1,2,3};
Console.WriteLine(a31.SequenceEqual(b31));
// 示例:题17 - Copy部分
int[] copy32 = new int[3];
Array.Copy(a31, copy32, 3);
Console.WriteLine(string.Join(" ", copy32));
// 示例:题18 - 是否有相同元素
Console.WriteLine(a31.Intersect(b31).Any());
// 示例:题19 - 奇数索引上的元素
Console.WriteLine(string.Join(" ", a31.Where((x, i) => i % 2 == 1)));
// 示例:题20 - Resize
Array.Resize(ref a31, 5);
Console.WriteLine(string.Join(" ", a31));
练习:应用题¶
// 示例:题1 - 成绩平均
int[] score36 = {80, 90, 85, 70, 95};
Console.WriteLine($"总分: {score36.Sum()}, 平均: {score36.Average()}");
// 示例:题2 - 彩票随机数
Random r = new Random();
int[] lottery = new int[7];
for (int i = 0; i < 7; i++) lottery[i] = r.Next(1, 31);
Console.WriteLine(string.Join(" ", lottery));
// 示例:题3 - 模拟菜单(略)
// 示例:题4 - IsSorted
bool isSorted = a31.SequenceEqual(a31.OrderBy(x => x));
Console.WriteLine("是否升序: " + isSorted);
// 示例:题5 - 回文
int[] pal = {1,2,3,2,1};
Console.WriteLine(pal.SequenceEqual(pal.Reverse()));
// 示例:题6 - MergeSorted略
// 示例:题7 - CountGreaterThan
int[] arr42 = {3, 8, 5};
int x42 = 4;
Console.WriteLine(arr42.Count(n => n > x42));
// 示例:题8 - 所有连续子数组
int[] arr43 = {1,2,3};
for (int i = 0; i < arr43.Length; i++)
for (int j = i; j < arr43.Length; j++)
Console.WriteLine(string.Join(" ", arr43[i..(j+1)]));
// 示例:题9 - 第二大
int[] arr44 = {4,5,1,3};
Console.WriteLine(arr44.Distinct().OrderByDescending(x => x).Skip(1).First());
// 示例:题10 - 是否逆序
int[] arr45a = {1,2,3}, arr45b = {3,2,1};
Console.WriteLine(arr45a.SequenceEqual(arr45b.Reverse()));
// 示例:题11 - 队列操作
int[] queue = {5,6,7};
queue = (new int[]{4}).Concat(queue).ToArray(); // 头部添加
queue = queue.Take(queue.Length - 1).ToArray(); // 尾部删除
Console.WriteLine(string.Join(" ", queue));
// 示例:题12 - 最高分学生编号
int[] scores47 = {78, 92, 85};
int maxIdx = Array.IndexOf(scores47, scores47.Max());
Console.WriteLine("编号: " + (maxIdx + 1));
// 示例:题13 - 二维数组按行输出
int[,] mat = { {1,2}, {3,4} };
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
Console.Write(mat[i,j] + " ");
// 示例:题14 - 斐波那契
int[] fib = new int[10]; fib[0]=0; fib[1]=1;
for (int i=2;i<10;i++) fib[i]=fib[i-1]+fib[i-2];
Console.WriteLine(string.Join(" ", fib));
// 示例:题15 - ReverseArray
int[] ReverseArray(int[] arr) => arr.Reverse().ToArray();
Console.WriteLine(string.Join(" ", ReverseArray(new int[]{1,2,3})));
C# 数组元素交换练习题(适合初学者)¶
以下是3道专门为初学者设计的数组元素交换练习题,重点练习临时变量的使用方法:
题目1:交换数组的首尾元素¶
using System;
class Program
{
static void Main()
{
// 创建一个包含5个整数的数组
int[] numbers = { 10, 20, 30, 40, 50 };
Console.WriteLine("交换前的数组:");
for (int i = 0; i < numbers.Length; i++)
{
Console.Write(numbers[i] + " ");
}
// 使用临时变量交换数组的第一个元素和最后一个元素
// 这里使用临时变量temp来暂存第一个元素的值
int temp = numbers[0]; // 步骤1:保存第一个元素的值到temp
numbers[0] = numbers[4]; // 步骤2:将最后一个元素的值赋给第一个元素
numbers[4] = temp; // 步骤3:将temp中保存的值赋给最后一个元素
Console.WriteLine("\n\n交换后的数组:");
for (int i = 0; i < numbers.Length; i++)
{
Console.Write(numbers[i] + " ");
}
}
}
题目2:交换数组中指定位置的两个元素¶
using System;
class Program
{
static void Main()
{
// 创建一个包含6个字符串的数组
string[] fruits = { "苹果", "香蕉", "橙子", "葡萄", "草莓", "西瓜" };
Console.WriteLine("交换前的数组:");
for (int i = 0; i < fruits.Length; i++)
{
Console.Write(fruits[i] + " ");
}
// 要求:交换第2个元素(索引1)和第5个元素(索引4)
int index1 = 1; // 要交换的第一个位置
int index2 = 4; // 要交换的第二个位置
// 使用临时变量交换指定位置的元素
string temp = fruits[index1]; // 步骤1:保存第一个位置的值
fruits[index1] = fruits[index2]; // 步骤2:将第二个位置的值赋给第一个位置
fruits[index2] = temp; // 步骤3:将保存的值赋给第二个位置
Console.WriteLine("\n\n交换第2个和第5个元素后的数组:");
for (int i = 0; i < fruits.Length; i++)
{
Console.Write(fruits[i] + " ");
}
}
}
题目3:将数组元素向右移动一位(循环移位)¶
using System;
class Program
{
static void Main()
{
// 创建一个包含5个整数的数组
int[] numbers = { 1, 2, 3, 4, 5 };
Console.WriteLine("移动前的数组:");
for (int i = 0; i < numbers.Length; i++)
{
Console.Write(numbers[i] + " ");
}
// 将数组所有元素向右移动一位,最后一个元素移动到第一个位置
// 例如:{1,2,3,4,5} 变成 {5,1,2,3,4}
// 步骤1:保存最后一个元素的值
int temp = numbers[numbers.Length - 1];
// 步骤2:从后向前,将每个元素的值赋给后一个位置
for (int i = numbers.Length - 1; i > 0; i--)
{
numbers[i] = numbers[i - 1];
}
// 步骤3:将保存的最后一个元素的值赋给第一个位置
numbers[0] = temp;
Console.WriteLine("\n\n向右移动一位后的数组:");
for (int i = 0; i < numbers.Length; i++)
{
Console.Write(numbers[i] + " ");
}
// 可选:反向操作,向左移动一位
Console.WriteLine("\n\n反向操作(向左移动一位)恢复原数组:");
// 保存第一个元素的值
temp = numbers[0];
// 从前向后,将每个元素的值赋给前一个位置
for (int i = 0; i < numbers.Length - 1; i++)
{
numbers[i] = numbers[i + 1];
}
// 将保存的第一个元素的值赋给最后一个位置
numbers[numbers.Length - 1] = temp;
for (int i = 0; i < numbers.Length; i++)
{
Console.Write(numbers[i] + " ");
}
}
}
练习提示:¶
- 临时变量的作用:临时变量用于暂存一个值,防止在交换过程中数据丢失
- 交换的三步法:
- 将第一个值保存到临时变量
- 将第二个值赋给第一个位置
- 将临时变量中的值赋给第二个位置
- 数组索引:注意C#数组索引从0开始
- 变量类型:临时变量的类型应与数组元素的类型一致
扩展挑战:¶
完成以上基础练习后,可以尝试: 1. 编写一个函数,接收数组和两个索引作为参数,交换这两个位置的元素 2. 实现数组反转(不使用Array.Reverse方法) 3. 实现数组元素向左移动k位
这些练习有助于加深对临时变量和数组操作的理解。
下面我系统、按初学者友好顺序,为你详解 C# 中 Array 类的常见属性与方法,并配合通俗解释 + 示例代码,非常适合教学或自学使用。
一、Array 类是什么?¶
在 C# 中:
表面上你在用的是 int[],
实际上所有数组都继承自 System.Array 类。
👉 Array 是所有数组的基类,提供了一系列通用操作方法和属性。
二、Array 的常见属性¶
1️⃣ Length —— 数组元素总数(最常用)¶
语法¶
说明¶
- 返回数组中元素的总个数
- 一维、多维数组都适用
示例¶
📌 注意
- 下标最大是
Length - 1 - 不能修改 Length(数组长度固定)
2️⃣ Rank —— 数组的维数¶
语法¶
示例¶
int[] a = new int[5];
int[,] b = new int[3, 4];
Console.WriteLine(a.Rank); // 1
Console.WriteLine(b.Rank); // 2
📌 常用于判断是否为多维数组
3️⃣ IsFixedSize —— 是否为固定大小(了解)¶
- 数组长度固定 → 永远返回
true - 更多用于与集合(如
ArrayList)对比
4️⃣ IsReadOnly —— 是否只读(了解)¶
- 普通数组:
false - 只读包装数组可能为
true
三、Array 的常见方法(重点)¶
1️⃣ GetValue / SetValue —— 通过下标访问元素(不常用)¶
示例¶
int[] nums = { 1, 2, 3 };
int value = (int)nums.GetValue(1);
nums.SetValue(100, 2);
Console.WriteLine(value); // 2
Console.WriteLine(nums[2]); // 100
📌 教学点
- 本质和
nums[i]一样 - 多维数组时较有用
2️⃣ Clone() —— 复制数组(浅拷贝)¶
示例¶
int[] a = { 1, 2, 3 };
int[] b = (int[])a.Clone();
b[0] = 100;
Console.WriteLine(a[0]); // 1
Console.WriteLine(b[0]); // 100
📌 结论
- 新数组对象
- 值类型:安全
- 引用类型:共享引用(浅拷贝)
3️⃣ Copy() —— 数组复制(非常常用)¶
语法¶
示例¶
📌 特点
- 复制指定数量
- 目标数组必须存在
4️⃣ Clear() —— 清空数组元素¶
语法¶
示例¶
int[] nums = { 1, 2, 3, 4 };
Array.Clear(nums, 1, 2);
Console.WriteLine(string.Join(",", nums));
// 1,0,0,4
📌 规则
- 数值 → 0
- 引用 → null
- bool → false
5️⃣ Sort() —— 排序(非常常用)¶
示例¶
int[] nums = { 5, 2, 9, 1 };
Array.Sort(nums);
Console.WriteLine(string.Join(",", nums));
// 1,2,5,9
📌 默认:
- 数值 → 升序
- 字符串 → 字典序
6️⃣ Reverse() —— 反转数组顺序¶
示例¶
7️⃣ IndexOf() / LastIndexOf() —— 查找元素¶
示例¶
int[] nums = { 10, 20, 30, 20 };
int i1 = Array.IndexOf(nums, 20);
int i2 = Array.LastIndexOf(nums, 20);
Console.WriteLine(i1); // 1
Console.WriteLine(i2); // 3
📌 找不到返回 -1
8️⃣ Exists() —— 是否存在符合条件的元素¶
示例¶
int[] nums = { 1, 3, 5 };
bool hasEven = Array.Exists(nums, n => n % 2 == 0);
Console.WriteLine(hasEven); // false
9️⃣ Find() / FindAll() —— 条件查找¶
示例¶
int[] nums = { 1, 2, 3, 4, 5 };
int firstEven = Array.Find(nums, n => n % 2 == 0);
int[] evens = Array.FindAll(nums, n => n % 2 == 0);
Console.WriteLine(firstEven); // 2
Console.WriteLine(string.Join(",", evens)); // 2,4
四、Array 类方法速查表(教学总结)¶
| 方法 | 功能 |
|---|---|
| Length | 获取元素个数 |
| Rank | 获取维数 |
| Clone | 复制数组 |
| Copy | 复制内容 |
| Clear | 清空元素 |
| Sort | 排序 |
| Reverse | 反转 |
| IndexOf | 查找索引 |
| Exists | 判断是否存在 |
| Find / FindAll | 条件查找 |
五、教学建议(给你这样的 C# 学习路线很适合)¶
你前面问过很多 C# 初学者知识点(File、Convert、for、接口等), Array 是“循环 + 条件 + 集合”的核心基础。
📌 建议教学顺序:
Length + forSort / ReverseCopy / CloneFind / Exists(Lambda 入门)
如果你愿意,我可以帮你:
- ✅ 出 10 道 Array 基础练习题(带答案)
- ✅ 做一张 Array 方法思维导图
- ✅ 对比 Array vs List
你选一个我直接给你整理 👍
10.升序排序¶
定义一个整数数组,使用 Array.Sort() 对其进行升序排序。
11.倒序排序¶
定义一个字符串数组,使用 Array.Reverse() 将其倒序排列。
12.查询位置¶
使用 Array.IndexOf() 找出元素 10 在数组 [3, 5, 10, 7, 10] 中的第一个位置。
13.查询位置¶
使用 Array.LastIndexOf() 查找元素 10 在数组中的最后一次出现位置。
14.元素是否存在¶
给定数组 [2, 4, 6, 8],使用 Array.Exists() 判断是否存在大于 5 的元素。
15.查询元素¶
在数组 [1, 3, 5, 7, 9] 中,使用 Array.Find() 找出第一个大于 4 的数。
16.查询元素¶
使用 Array.FindAll() 找出 [10, 20, 30, 25, 15] 中所有大于等于 20 的元素。
17.查询元素¶
使用 Array.TrueForAll() 判断 [2, 4, 6, 8] 中是否所有元素都是偶数。
18.查询索引¶
使用 Array.IndexOf() 查找不存在的值(比如查找 99),观察结果。
19.反转数组¶
定义一个数组 [1, 2, 3, 4, 5],使用 Array.Reverse() 然后输出结果。
20.排序数组¶
用 Array.Sort() 排序一个乱序的数组 [5, 2, 9, 1, 3] 并输出。
21.查询元素¶
判断 [1, 3, 5, 7] 中是否存在偶数(Array.Exists())。
22.查询元素¶
找出字符串数组中第一个长度大于 5 的字符串(使用 Array.Find())。
23.查询元素¶
找出 ["dog", "cat", "elephant", "ant"] 中所有以字母 a 开头的字符串(FindAll())。
24.查询元素¶
判断 [10, 20, 30, 40] 是否所有元素都能被 5 整除(使用 TrueForAll())。
10.
11.
12.
13.
14.
15.
16.
// 7. FindAll
int[] arr6 = { 10, 20, 30, 25, 15 };
int[] filtered = Array.FindAll(arr6, n => n >= 20);
17.
18.
19.
20.
21.
21.
// 13. Find string length > 5
string[] words = { "hi", "banana", "code", "carpet" };
string longWord = Array.Find(words, s => s.Length > 5);
22.
// 14. FindAll startsWith 'a'
string[] animals = { "dog", "cat", "elephant", "ant" };
string[] aAnimals = Array.FindAll(animals, s => s.StartsWith("a"));
23.
// 15. TrueForAll divisible by 5
int[] arr9 = { 10, 20, 30, 40 };
bool allDiv5 = Array.TrueForAll(arr9, n => n % 5 == 0);
练习:Array.Sort()(10道)¶
- 将整数数组
{9, 4, 2, 7, 1}使用Array.Sort()按升序排序。 - 将字符串数组
{ "banana", "apple", "cherry" }使用Array.Sort()按字典顺序排序。 - 将数组
{ 10, 2, 8, 5, 3 }使用Array.Sort()排序后,再使用Array.Reverse()实现降序排序。 - 将数组
{ 5, 9, 2, 7, 6, 1 }的第 2 个元素起连续 3 个元素(即 9, 2, 7)按升序排序。 - 对数组
{ 100, 50, 200, 30, 10 }的最后三个元素使用区间排序。 - 对数组
{ "dog", "cat", "apple", "zebra", "bat" }的中间 3 个元素排序后,再整体倒序输出。 - 将浮点数组
{3.1, 2.4, 5.6, 1.2}进行升序排序。 - 将数组
{ 5, 4, 3, 2, 1 }通过排序和反转的方式变为{1, 2, 3, 4, 5},再变为{5, 4, 3, 2, 1}。 - 给定数组
{8, 3, 7, 9, 2, 6},只对下标 1 \~ 4 的元素进行排序,不影响其他位置。 - 对字符串数组
{ "Sun", "Earth", "Mars", "Venus" }使用Array.Sort()排序,再用Array.Reverse()实现降序排序。
答案:Array.Sort()(10道)¶
// 题 1:升序排序整数数组
int[] arr1 = { 9, 4, 2, 7, 1 };
Array.Sort(arr1);
Console.WriteLine("题1: " + string.Join(", ", arr1));
// 题 2:按字典顺序排序字符串数组
string[] arr2 = { "banana", "apple", "cherry" };
Array.Sort(arr2);
Console.WriteLine("题2: " + string.Join(", ", arr2));
// 题 3:升序后再倒序(降序)
int[] arr3 = { 10, 2, 8, 5, 3 };
Array.Sort(arr3);
Array.Reverse(arr3);
Console.WriteLine("题3: " + string.Join(", ", arr3));
// 题 4:区间排序部分数组
int[] arr4 = { 5, 9, 2, 7, 6, 1 };
Array.Sort(arr4, 1, 3); // 排序元素9,2,7
Console.WriteLine("题4: " + string.Join(", ", arr4));
// 题 5:最后三个元素排序
int[] arr5 = { 100, 50, 200, 30, 10 };
Array.Sort(arr5, 2, 3); // 200, 30, 10
Console.WriteLine("题5: " + string.Join(", ", arr5));
// 题 6:中间三个字符串排序+整体倒序
string[] arr6 = { "dog", "cat", "apple", "zebra", "bat" };
Array.Sort(arr6, 1, 3); // cat, apple, zebra
Array.Reverse(arr6);
Console.WriteLine("题6: " + string.Join(", ", arr6));
// 题 7:浮点数排序
double[] arr7 = { 3.1, 2.4, 5.6, 1.2 };
Array.Sort(arr7);
Console.WriteLine("题7: " + string.Join(", ", arr7));
// 题 8:先升序再降序
int[] arr8 = { 5, 4, 3, 2, 1 };
Array.Sort(arr8);
Console.WriteLine("题8-升序: " + string.Join(", ", arr8));
Array.Reverse(arr8);
Console.WriteLine("题8-降序: " + string.Join(", ", arr8));
// 题 9:仅对中间部分排序
int[] arr9 = { 8, 3, 7, 9, 2, 6 };
Array.Sort(arr9, 1, 4); // 3, 7, 9, 2 => 2,3,7,9
Console.WriteLine("题9: " + string.Join(", ", arr9));
// 题 10:字符串排序后倒序
string[] arr10 = { "Sun", "Earth", "Mars", "Venus" };
Array.Sort(arr10);
Array.Reverse(arr10);
Console.WriteLine("题10: " + string.Join(", ", arr10));
练习:中级题(15 道)¶
- 对一个整数数组先升序排序(
Sort()),再倒序(Reverse()),实现降序排列。 - 给定一个数组
[1, 3, 5, 3, 1],找出值为3的第一个和最后一个索引。 - 用
Find()找出数组[11, 22, 33, 44]中第一个能被 11 整除的元素。 - 在数组
[3, 6, 9, 12]中找出所有能被 6 整除的数(FindAll())。 - 判断数组
[-2, -4, -6, -8]是否所有值都是负数(TrueForAll())。 - 给定字符串数组
["apple", "banana", "cherry", "apricot"],找出所有以 "a" 开头的元素。 - 写一段代码判断数组是否已按升序排列(提示:配合
Sort()和SequenceEqual())。 - 找出数组中第一个值为奇数且大于 10 的元素。
- 编写一个方法,接受任意整数数组,返回所有偶数元素组成的新数组(使用
FindAll())。 - 给定数组
[1, 2, 3, 4, 5],使用Reverse()和IndexOf()找出原来倒数第二个元素现在的新索引。 - 查找数组
[2, 4, 6, 8]中不存在的值7的索引,并处理结果避免错误输出。 - 给定数组
[100, 90, 80, 70, 60],不使用Sort(),而是先Reverse()再判断是否降序排列。 - 使用
Exists()判断字符串数组中是否有空字符串""。 - 判断数组中是否所有字符串长度都大于 0(使用
TrueForAll())。 - 综合题:定义一个整数数组,输出其中所有能被 3 整除但不能被 5 整除的元素(使用
FindAll())。
答案:中级题(15 道)¶
/// 1. Sort + Reverse (降序)
int[] arr1 = { 7, 2, 9 };
Array.Sort(arr1);
Array.Reverse(arr1);
// 2. IndexOf & LastIndexOf
int[] arr2 = { 1, 3, 5, 3, 1 };
int first3 = Array.IndexOf(arr2, 3);
int last3 = Array.LastIndexOf(arr2, 3);
// 3. Find divisible by 11
int[] arr3 = { 11, 22, 33, 44 };
int firstDiv11 = Array.Find(arr3, n => n % 11 == 0);
// 4. FindAll divisible by 6
int[] arr4 = { 3, 6, 9, 12 };
int[] div6 = Array.FindAll(arr4, n => n % 6 == 0);
// 5. All negative
int[] arr5 = { -2, -4, -6, -8 };
bool allNegative = Array.TrueForAll(arr5, n => n < 0);
// 6. FindAll starts with 'a'
string[] fruits = { "apple", "banana", "cherry", "apricot" };
string[] startsA = Array.FindAll(fruits, f => f.StartsWith("a"));
// 7. Check if sorted ascending
int[] arr6 = { 1, 2, 3, 4 };
int[] sorted = (int[])arr6.Clone();
Array.Sort(sorted);
bool isSorted = arr6.SequenceEqual(sorted);
// 8. Find odd > 10
int[] arr7 = { 3, 8, 11, 13 };
int res1 = Array.Find(arr7, x => x % 2 == 1 && x > 10);
// 9. Method return even numbers
int[] EvenOnly(int[] input) => Array.FindAll(input, n => n % 2 == 0);
// 10. Reverse and find original 2nd-last index
int[] arr8 = { 1, 2, 3, 4, 5 };
int original = arr8[arr8.Length - 2];
Array.Reverse(arr8);
int newIndex = Array.IndexOf(arr8, original);
// 1. Not found IndexOf
int[] arr9 = { 2, 4, 6, 8 };
int idx = Array.IndexOf(arr9, 7); // -1
// 12. Check descending after reverse
int[] arr10 = { 100, 90, 80, 70, 60 };
Array.Reverse(arr10);
bool isDesc = arr10.SequenceEqual(arr10.OrderByDescending(x => x).ToArray());
// 13. Exists empty string
string[] strArr = { "hello", "", "world" };
bool hasEmpty = Array.Exists(strArr, s => s == "");
// 14. All strings length > 0
bool allNonEmpty = Array.TrueForAll(strArr, s => s.Length > 0);
// 15. FindAll: %3==0 and %5!=0
int[] arr11 = { 3, 5, 6, 9, 10, 12, 15 };
int[] res2 = Array.FindAll(arr11, x => x % 3 == 0 && x % 5 != 0);
练习:基础¶
// 示例:题1 - 打印固定数组
int[] arr1 = {1, 2, 3, 4, 5};
Console.WriteLine(string.Join(" ", arr1));
// 示例:题2 - 字符串数组访问
string[] cities = {"北京", "上海", "广州"};
Console.WriteLine(cities[0] + " " + cities[2]);
// 示例:题3 - 输入5个整数
int[] arr3 = new int[5];
for (int i = 0; i < 5; i++)
arr3[i] = int.Parse(Console.ReadLine());
Console.WriteLine(string.Join(" ", arr3));
// 示例:题4 - 找最大值
int[] arr4 = {4, 1, 9, 3, 5};
Console.WriteLine(arr4.Max());
// 示例:题5 - 求平均值
int[] arr5 = {4, 6, 8, 10, 12};
Console.WriteLine(arr5.Average());
// 示例:题6 - 求和
int[] arr6 = {3, 5, 7, 2, 8};
Console.WriteLine(arr6.Sum());
// 示例:题7 - 所有元素乘2
int[] arr7 = arr6.Select(x => x * 2).ToArray();
Console.WriteLine(string.Join(" ", arr7));
// 示例:题8 - 查找元素
int find8 = 5;
Console.WriteLine(arr6.Contains(find8));
// 示例:题9 - 找第一个负数
int[] arr9 = {2, -3, 4, -1};
Console.WriteLine(arr9.First(x => x < 0));
// 示例:题10 - 统计正数
Console.WriteLine(arr9.Count(x => x > 0));
// 示例:题11 - 反转
Array.Reverse(arr9);
Console.WriteLine(string.Join(" ", arr9));
// 示例:题12 - 数组复制
int[] copy12 = new int[arr9.Length];
Array.Copy(arr9, copy12, arr9.Length);
Console.WriteLine(string.Join(" ", copy12));
// 示例:题13 - 判断是否为空
int[] arr13 = new int[0];
Console.WriteLine(arr13.Length == 0);
// 示例:题14 - 输出指定索引
int idx14 = 2;
Console.WriteLine(idx14 < arr6.Length ? arr6[idx14].ToString() : "索引越界");
// 示例:题15 - 打印大写字母
char[] arr15 = {'A','b','C','d'};
foreach (char c in arr15) if (char.IsUpper(c)) Console.Write(c + " ");
练习:进阶¶
// 示例:题1 - 排序
Array.Sort(arr6);
Console.WriteLine(string.Join(" ", arr6));
// 示例:题2 - 反转
Array.Reverse(arr6);
Console.WriteLine(string.Join(" ", arr6));
// 示例:题3 - 输入10个数找最大最小
int[] arr18 = new int[10];
for (int i = 0; i < 10; i++) arr18[i] = int.Parse(Console.ReadLine());
Console.WriteLine($"Max: {arr18.Max()} Min: {arr18.Min()}");
// 示例:题4 - 全部偶数?
Console.WriteLine(Array.TrueForAll(arr6, x => x % 2 == 0));
// 示例:题5 - 提取偶数
int[] evens20 = Array.FindAll(arr6, x => x % 2 == 0);
Console.WriteLine(string.Join(" ", evens20));
// 示例:题6 - 合并数组
int[] arr21a = {1,2}, arr21b = {3,4};
int[] merged21 = arr21a.Concat(arr21b).ToArray();
Console.WriteLine(string.Join(" ", merged21));
// 示例:题7 - 删除元素(5)
int[] arr22 = {1,5,3,5,4};
arr22 = arr22.Where(x => x != 5).ToArray();
Console.WriteLine(string.Join(" ", arr22));
// 示例:题8 - 有重复元素?
int[] arr23 = {1,2,3,1};
Console.WriteLine(arr23.Length != arr23.Distinct().Count());
// 示例:题9 - 大于平均数
double avg24 = arr6.Average();
Console.WriteLine(string.Join(" ", arr6.Where(x => x > avg24)));
// 示例:题10 - Find第一个被3整除
Console.WriteLine(Array.Find(arr6, x => x % 3 == 0));
// 示例:题11 - FindAll被5整除
Console.WriteLine(string.Join(" ", Array.FindAll(arr6, x => x % 5 == 0)));
// 示例:题12 - IndexOf
Console.WriteLine(Array.IndexOf(arr6, 8));
// 示例:题13 - 负数替换为0
int[] arr28 = {-1,2,-3};
arr28 = arr28.Select(x => x < 0 ? 0 : x).ToArray();
Console.WriteLine(string.Join(" ", arr28));
// 示例:题14 - 元素次数统计
int[] arr29 = {1,2,1,3};
Console.WriteLine(arr29.Count(x => x == 1));
// 示例:题15 - 去重
int[] arr30 = {1,2,2,3,3};
Console.WriteLine(string.Join(" ", arr30.Distinct()));
// 示例:题16 - 比较数组是否相等
int[] a31 = {1,2,3}, b31 = {1,2,3};
Console.WriteLine(a31.SequenceEqual(b31));
// 示例:题17 - Copy部分
int[] copy32 = new int[3];
Array.Copy(a31, copy32, 3);
Console.WriteLine(string.Join(" ", copy32));
// 示例:题18 - 是否有相同元素
Console.WriteLine(a31.Intersect(b31).Any());
// 示例:题19 - 奇数索引上的元素
Console.WriteLine(string.Join(" ", a31.Where((x, i) => i % 2 == 1)));
// 示例:题20 - Resize
Array.Resize(ref a31, 5);
Console.WriteLine(string.Join(" ", a31));
练习:应用题¶
// 示例:题1 - 成绩平均
int[] score36 = {80, 90, 85, 70, 95};
Console.WriteLine($"总分: {score36.Sum()}, 平均: {score36.Average()}");
// 示例:题2 - 彩票随机数
Random r = new Random();
int[] lottery = new int[7];
for (int i = 0; i < 7; i++) lottery[i] = r.Next(1, 31);
Console.WriteLine(string.Join(" ", lottery));
// 示例:题3 - 模拟菜单(略)
// 示例:题4 - IsSorted
bool isSorted = a31.SequenceEqual(a31.OrderBy(x => x));
Console.WriteLine("是否升序: " + isSorted);
// 示例:题5 - 回文
int[] pal = {1,2,3,2,1};
Console.WriteLine(pal.SequenceEqual(pal.Reverse()));
// 示例:题6 - MergeSorted略
// 示例:题7 - CountGreaterThan
int[] arr42 = {3, 8, 5};
int x42 = 4;
Console.WriteLine(arr42.Count(n => n > x42));
// 示例:题8 - 所有连续子数组
int[] arr43 = {1,2,3};
for (int i = 0; i < arr43.Length; i++)
for (int j = i; j < arr43.Length; j++)
Console.WriteLine(string.Join(" ", arr43[i..(j+1)]));
// 示例:题9 - 第二大
int[] arr44 = {4,5,1,3};
Console.WriteLine(arr44.Distinct().OrderByDescending(x => x).Skip(1).First());
// 示例:题10 - 是否逆序
int[] arr45a = {1,2,3}, arr45b = {3,2,1};
Console.WriteLine(arr45a.SequenceEqual(arr45b.Reverse()));
// 示例:题11 - 队列操作
int[] queue = {5,6,7};
queue = (new int[]{4}).Concat(queue).ToArray(); // 头部添加
queue = queue.Take(queue.Length - 1).ToArray(); // 尾部删除
Console.WriteLine(string.Join(" ", queue));
// 示例:题12 - 最高分学生编号
int[] scores47 = {78, 92, 85};
int maxIdx = Array.IndexOf(scores47, scores47.Max());
Console.WriteLine("编号: " + (maxIdx + 1));
// 示例:题13 - 二维数组按行输出
int[,] mat = { {1,2}, {3,4} };
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
Console.Write(mat[i,j] + " ");
// 示例:题14 - 斐波那契
int[] fib = new int[10]; fib[0]=0; fib[1]=1;
for (int i=2;i<10;i++) fib[i]=fib[i-1]+fib[i-2];
Console.WriteLine(string.Join(" ", fib));
// 示例:题15 - ReverseArray
int[] ReverseArray(int[] arr) => arr.Reverse().ToArray();
Console.WriteLine(string.Join(" ", ReverseArray(new int[]{1,2,3})));