跳转至

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()

  1. 将数组 { 10, 2, 8, 5, 3 } 使用 Array.Sort() 排序后,再使用 Array.Reverse() 实现降序排序。
  2. 将数组 { 5, 4, 3, 2, 1 } 通过排序和反转的方式变为 {1, 2, 3, 4, 5},再变为 {5, 4, 3, 2, 1}
  3. 对字符串数组 { "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()

int found = Array.Find(numbers, x => x > 6);  // 返回 7

Array.Exists()

bool existsEven = Array.Exists(arr, x => x % 2 == 0);  // 返回 true

Array.ForEach()

// 遍历与操作示例
Array.ForEach(arr, x => Console.Write(x + " "));  // 输出: 9 8 5 2 1

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 道)

  1. 对一个整数数组先升序排序(Sort()),再倒序(Reverse()),实现降序排列。
  2. 给定一个数组 [1, 3, 5, 3, 1],找出值为 3 的第一个和最后一个索引。
  3. Find() 找出数组 [11, 22, 33, 44] 中第一个能被 11 整除的元素。
  4. 在数组 [3, 6, 9, 12] 中找出所有能被 6 整除的数(FindAll())。
  5. 判断数组 [-2, -4, -6, -8] 是否所有值都是负数(TrueForAll())。
  6. 给定字符串数组 ["apple", "banana", "cherry", "apricot"],找出所有以 "a" 开头的元素。
  7. 写一段代码判断数组是否已按升序排列(提示:配合 Sort()SequenceEqual())。
  8. 找出数组中第一个值为奇数且大于 10 的元素。
  9. 编写一个方法,接受任意整数数组,返回所有偶数元素组成的新数组(使用 FindAll())。
  10. 给定数组 [1, 2, 3, 4, 5],使用 Reverse()IndexOf() 找出原来倒数第二个元素现在的新索引。
  11. 查找数组 [2, 4, 6, 8] 中不存在的值 7 的索引,并处理结果避免错误输出。
  12. 给定数组 [100, 90, 80, 70, 60],不使用 Sort(),而是先 Reverse() 再判断是否降序排列。
  13. 使用 Exists() 判断字符串数组中是否有空字符串 ""

  14. 综合题:定义一个整数数组,输出其中所有能被 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] + " ");
        }
    }
}

练习提示:

  1. 临时变量的作用:临时变量用于暂存一个值,防止在交换过程中数据丢失
  2. 交换的三步法
  3. 将第一个值保存到临时变量
  4. 将第二个值赋给第一个位置
  5. 将临时变量中的值赋给第二个位置
  6. 数组索引:注意C#数组索引从0开始
  7. 变量类型:临时变量的类型应与数组元素的类型一致

扩展挑战:

完成以上基础练习后,可以尝试: 1. 编写一个函数,接收数组和两个索引作为参数,交换这两个位置的元素 2. 实现数组反转(不使用Array.Reverse方法) 3. 实现数组元素向左移动k位

这些练习有助于加深对临时变量和数组操作的理解。

下面我系统、按初学者友好顺序,为你详解 C# 中 Array 类的常见属性与方法,并配合通俗解释 + 示例代码,非常适合教学或自学使用。


一、Array 类是什么?

在 C# 中:

int[] nums = { 1, 2, 3 };

表面上你在用的是 int[]实际上所有数组都继承自 System.Array

👉 Array 是所有数组的基类,提供了一系列通用操作方法和属性


二、Array 的常见属性

1️⃣ Length —— 数组元素总数(最常用)

语法

array.Length

说明

  • 返回数组中元素的总个数
  • 一维、多维数组都适用

示例

int[] nums = { 10, 20, 30 };

Console.WriteLine(nums.Length);   // 输出:3

📌 注意

  • 下标最大是 Length - 1
  • 不能修改 Length(数组长度固定)

2️⃣ Rank —— 数组的维数

语法

array.Rank

示例

int[] a = new int[5];
int[,] b = new int[3, 4];

Console.WriteLine(a.Rank); // 1
Console.WriteLine(b.Rank); // 2

📌 常用于判断是否为多维数组


3️⃣ IsFixedSize —— 是否为固定大小(了解)

bool fixedSize = array.IsFixedSize;
  • 数组长度固定 → 永远返回 true
  • 更多用于与集合(如 ArrayList)对比

4️⃣ IsReadOnly —— 是否只读(了解)

bool readOnly = array.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() —— 数组复制(非常常用)

语法

Array.Copy(源数组, 目标数组, 复制长度);

示例

int[] src = { 1, 2, 3, 4 };
int[] dest = new int[4];

Array.Copy(src, dest, 4);

📌 特点

  • 复制指定数量
  • 目标数组必须存在

4️⃣ Clear() —— 清空数组元素

语法

Array.Clear(array, 起始索引, 个数);

示例

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() —— 反转数组顺序

示例

int[] nums = { 1, 2, 3 };

Array.Reverse(nums);

Console.WriteLine(string.Join(",", nums));
// 3,2,1

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 是“循环 + 条件 + 集合”的核心基础

📌 建议教学顺序:

  1. Length + for
  2. Sort / Reverse
  3. Copy / Clone
  4. Find / 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.

// 1. Sort
int[] arr1 = { 4, 2, 9, 1 };
Array.Sort(arr1);

11.

// 2. Reverse
string[] arr2 = { "apple", "banana", "cherry" };
Array.Reverse(arr2);

12.

// 3. IndexOf
int[] arr3 = { 3, 5, 10, 7, 10 };
int idx1 = Array.IndexOf(arr3, 10);

13.

// 4. LastIndexOf
int idx2 = Array.LastIndexOf(arr3, 10);

14.

// 5. Exists
int[] arr4 = { 2, 4, 6, 8 };
bool exists1 = Array.Exists(arr4, n => n > 5);

15.

// 6. Find
int[] arr5 = { 1, 3, 5, 7, 9 };
int firstGreater4 = Array.Find(arr5, n => n > 4);

16.

// 7. FindAll
int[] arr6 = { 10, 20, 30, 25, 15 };
int[] filtered = Array.FindAll(arr6, n => n >= 20);

17.

// 8. TrueForAll
bool allEven = Array.TrueForAll(arr4, n => n % 2 == 0);

18.

// 9. IndexOf not found
int idx3 = Array.IndexOf(arr5, 99); // -1

19.

// 10. Reverse array
int[] arr7 = { 1, 2, 3, 4, 5 };
Array.Reverse(arr7);

20.

// 11. Sort array
int[] arr8 = { 5, 2, 9, 1, 3 };
Array.Sort(arr8);

21.

// 12. Exists even
bool hasEven = Array.Exists(arr5, n => n % 2 == 0);

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道)

  1. 将整数数组 {9, 4, 2, 7, 1} 使用 Array.Sort() 按升序排序。
  2. 将字符串数组 { "banana", "apple", "cherry" } 使用 Array.Sort() 按字典顺序排序。
  3. 将数组 { 10, 2, 8, 5, 3 } 使用 Array.Sort() 排序后,再使用 Array.Reverse() 实现降序排序。
  4. 将数组 { 5, 9, 2, 7, 6, 1 } 的第 2 个元素起连续 3 个元素(即 9, 2, 7)按升序排序。
  5. 对数组 { 100, 50, 200, 30, 10 } 的最后三个元素使用区间排序。
  6. 对数组 { "dog", "cat", "apple", "zebra", "bat" } 的中间 3 个元素排序后,再整体倒序输出。
  7. 将浮点数组 {3.1, 2.4, 5.6, 1.2} 进行升序排序。
  8. 将数组 { 5, 4, 3, 2, 1 } 通过排序和反转的方式变为 {1, 2, 3, 4, 5},再变为 {5, 4, 3, 2, 1}
  9. 给定数组 {8, 3, 7, 9, 2, 6},只对下标 1 \~ 4 的元素进行排序,不影响其他位置。
  10. 对字符串数组 { "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 道)

  1. 对一个整数数组先升序排序(Sort()),再倒序(Reverse()),实现降序排列。
  2. 给定一个数组 [1, 3, 5, 3, 1],找出值为 3 的第一个和最后一个索引。
  3. Find() 找出数组 [11, 22, 33, 44] 中第一个能被 11 整除的元素。
  4. 在数组 [3, 6, 9, 12] 中找出所有能被 6 整除的数(FindAll())。
  5. 判断数组 [-2, -4, -6, -8] 是否所有值都是负数(TrueForAll())。
  6. 给定字符串数组 ["apple", "banana", "cherry", "apricot"],找出所有以 "a" 开头的元素。
  7. 写一段代码判断数组是否已按升序排列(提示:配合 Sort()SequenceEqual())。
  8. 找出数组中第一个值为奇数且大于 10 的元素。
  9. 编写一个方法,接受任意整数数组,返回所有偶数元素组成的新数组(使用 FindAll())。
  10. 给定数组 [1, 2, 3, 4, 5],使用 Reverse()IndexOf() 找出原来倒数第二个元素现在的新索引。
  11. 查找数组 [2, 4, 6, 8] 中不存在的值 7 的索引,并处理结果避免错误输出。
  12. 给定数组 [100, 90, 80, 70, 60],不使用 Sort(),而是先 Reverse() 再判断是否降序排列。
  13. 使用 Exists() 判断字符串数组中是否有空字符串 ""
  14. 判断数组中是否所有字符串长度都大于 0(使用 TrueForAll())。
  15. 综合题:定义一个整数数组,输出其中所有能被 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})));