C# 数组怎么从小到大排序?附 3 种方法讲清楚

编程狮(w3cschool.cn) 2026-08-19 15:01:33 浏览数 (104)
反馈

C# 数组怎么从小到大排序

你刚学 C#,手里有一个 int[] 数组,想让它从小到大排好序,却不知道该用哪个方法?C#数组排序是C#基础阶段的必修课,无论是刷算法题还是处理业务数据,都会用到。最省事的做法,是调用 Array.Sort 方法:一行就能把整个数组排成升序。本文基于 .NET 6 验证,把 Array.Sort、LINQ 的 OrderBy、以及手写冒泡排序三种方式一次讲清,并说明各自的适用场景和常见坑点。今天这篇文章,编程狮就把数组排序讲透。

一、先明确:我们要排的是什么

排序的前提,是数组里的元素能互相比较大小。对 intdoublestring 这类基础类型,C# 天生知道谁大谁小;但如果是一个你自己定义的「学生」对象,就得告诉它按什么字段比,比如按年龄还是按分数。

动手前,建议先过一遍 C# 教程 里数组和 LINQ 的基础章节,后面三种写法会更容易理解。

二、方案一:Array.Sort() 一行搞定升序(最推荐)

Array.Sort() 是系统自带的方法,直接修改原数组,把它排成升序,写法极其简单。它是 C# 数组排序中最推荐的入门方式——不需要额外引用命名空间,不需要理解泛型或委托,一行代码就能完成。

int[] nums = { 5, 2, 8, 1, 9 };
Array.Sort(nums);
foreach (var n in nums) Console.Write(n + " ");
// 输出:1 2 5 8 9

上面这段里,Array.Sort(nums) 在原数组上直接排好序,不返回新数组。它底层用的是经过高度优化的 introsort 算法(快速排序 + 堆排序 + 插入排序的混合体),速度快、代码少,绝大多数场景用它就够了。

💡 小提示:Array.Sort 默认是「升序」。如果你想要降序,可以再接一个 Array.Reverse(nums),或者看下面的 LINQ 写法。也可以用 Array.Sort(nums, Comparer<int&.Create((a, b) =& b.CompareTo(a))) 直接指定降序比较器,但写法稍复杂,新手用 Reverse 更直观。

三、方案二:LINQ 的 OrderBy() 函数式写法

如果你喜欢「不改原数据、返回新序列」的风格,可以用 LINQ OrderBy 方法。它不会动原数组,而是返回一个排好序的新结果。LINQ OrderBy 是 C# 函数式数据处理的入口,掌握它之后,排序、过滤、分组都能用链式写法串起来,代码量大幅减少。

using System.Linq;


int[] nums = { 5, 2, 8, 1, 9 };
var sorted = nums.OrderBy(x => x).ToArray();
foreach (var n in sorted) Console.Write(n + " ");
// 输出:1 2 5 8 9

上面这段里,OrderBy(x => x) 表示「按元素自身大小排」,.ToArray() 把结果变回数组。降序只要换成 OrderByDescending(x => x)。这种写法在连串处理数据时特别顺手,比如先过滤再排序再取前几名:nums.Where(x => x > 3).OrderBy(x => x).Take(2).ToArray(),一条链式调用就能完成多步操作。

需要注意,LINQ 的排序结果是一个 IOrderedEnumerable<T> 接口,不是数组。你不调 .ToArray().ToList(),它就不会真正执行——这是「延迟执行」的特性,在真正遍历结果时才会计算。

四、方案三:手写冒泡排序,理解排序底层

前两种都是「调现成方法」,如果你是为了应付考试或面试,可能需要自己写出来。这类底层数组交换在 C 语言教程 里写得最直观。冒泡排序是最容易理解的入门算法:相邻两个比大小,大的往后挪,一轮下来最大的就沉到末尾。

int[] nums = { 5, 2, 8, 1, 9 };
for (int i = 0; i < nums.Length - 1; i++)
    for (int j = 0; j < nums.Length - 1 - i; j++)
        if (nums[j] > nums[j + 1])
        {
            int tmp = nums[j];
            nums[j] = nums[j + 1];
            nums[j + 1] = tmp;
        }

上面这段里,两层循环不断把较大的数向右交换,每一轮少比较一个已经排好的数。冒泡排序胜在好懂,但效率比系统自带方法低——它的时间复杂度是 O(n²),数据量翻倍时耗时大约变成四倍。真实项目里一般不手写,主要用来打基础和应付面试。想看更多经典算法实现,C++ 教程 里的例子很全。

五、三种方式横向对比与常见坑

方式 是否改原数组 返回新数组 适合场景
Array.Sort() 追求简单快速,不介意改原数据
OrderBy() 函数式链式处理,想保留原数组
冒泡排序 学习算法、面试手写

⚠️ 注意:Array.Sort 会直接改动你传进去的数组。如果这个数组后面还要按原顺序用,记得先 nums.ToArray() 复制一份再排,否则原顺序就丢了。

对自定义对象排序时,要额外传入比较规则(比如 Comparer),不能直接排,否则运行时会报错。例如你有一个 Student 类,想按分数排序,就得写成 Array.Sort(students, (a, b) => a.Score.CompareTo(b.Score)),告诉系统到底比哪个字段。如果不提供比较规则,系统不知道两个对象谁大谁小,就会抛出异常。

日常开发中,C#数组排序最常见的场景是:从数据库或接口拿到一组数据,按某个字段排好序再展示给用户。这种场景下,LINQ OrderBy 的链式写法通常更顺手,因为你往往还需要同时做过滤、分页等操作,一条 LINQ 链就能全部搞定。而 Array.Sort 更适合「我就有一个数组,排完序直接用」的简单场景。

C# 三种数组排序方法对比表

总结

给 C# 数组排升序,最推荐直接 Array.Sort(),一行搞定、速度也快;想要不改原数组的函数式写法,用 LINQ 的 OrderBy();手写冒泡排序则用于理解排序原理和应对面试。

要点带走:

  • Array.Sort() 原地排序、速度快,但会改掉原数组;
  • OrderBy() 返回新序列,适合链式数据处理;
  • 冒泡排序好理解但效率低,真实项目通常不用;
  • 自定义对象排序要提供比较规则,不能裸排。

下一步,建议把这三种写法各敲一遍,再试试对字符串数组排序,体会「比较规则」是怎么起作用的。

延伸学习

想把 C# 基础系统补齐,可以按这个顺序来:

  1. 先把数组、LINQ 这些语法过扎实,跟着 C# 入门课程 边学边练会更连贯;
  2. 排序、对象比较这类知识点,配套的小练习做一遍,比只看文档记得牢;
  3. 想挑战算法题,编程面试:算法问题 能带你从刷题角度巩固。

常见问题

Q:Array.Sort 和 OrderBy 该用哪个?
A:只想要结果、不介意改原数组,用 Array.Sort 最省事;想保留原数组、或在一条数据处理链里排序,用 OrderBy。两者排序结果一样,区别在是否改动原数据。

Q:为什么我对自定义对象排序会报错?
A:因为系统不知道按哪个字段比大小。你需要传入比较规则,比如用 Array.Sort(数组, (a, b) => a.Age.CompareTo(b.Age)) 这种写法指定按 Age 比。

Q:想排成降序怎么办?
A:Array.Sort 排完接 Array.Reverse(nums);用 LINQ 则直接写 OrderByDescending(x => x),比先升序再反转更直观。

Q:冒泡排序和系统方法差很多吗?
A:对少量数据差别不大,但数据量一大,系统方法的效率远高于手写的冒泡排序。真实项目里直接用现成方法,冒泡主要用来理解「排序到底在做什么」。如果你正在准备面试,建议把冒泡排序的写法背熟,同时也要能说清楚它的时间复杂度是 O(n²),以及为什么实际项目里不推荐使用。

C#

0 人点赞