在寫程式時我們常常會用到陣列來儲存與處理多筆相同類型的資料,當我們需要將陣列進行排序時將會使用到 Array.Sort 與 CompareTo 兩個核心方法。
Array.Sort
1var example = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
2
3// Ascending
4Array.Sort(example, (a, b) => a.CompareTo(b));
5Console.WriteLine($"{string.Join(", ", example)}");
6// Output:
7// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
8
9// Descending
10Array.Sort(example, (a, b) => -a.CompareTo(b));
11Console.WriteLine($"{string.Join(", ", example)}");
12// Output:
13// 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
要對 Array 排序需要用到 Array.Sort 方法,第一個參數即為待排序的陣列,第二個則是 Comparison 委派,我們這裡用 Lamda 來實作。
語法如下:
1Array.Sort(待排序陣列, Comparison<T>);
升序 Ascending
首先是升序 (Ascending),將陣列中的元素由小到大排序,在這裡我們簡單用一個整數陣列作為範例。
1var example = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
寫法如下:
1Array.Sort(example, (a, b) => a.CompareTo(b));
2// 輸出:
3// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
降序 Descending
降序 (Descending) 則是將陣列中的元素由大到小排序。只需將升序的 Lamda 中加上負號即可:
1Array.Sort(example, (a, b) => -a.CompareTo(b));
2// 輸出:
3// 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
CompareTo
1Console.WriteLine(1.CompareTo(2));
2// Output:
3// -1
4
5Console.WriteLine(1.CompareTo(1));
6// Output:
7// 0
8
9Console.WriteLine(1.CompareTo(0));
10// Output:
11// 1
Array.Sort 中的 Comparison 委派可以使用 Lamda 語法來實作,將使用到 CompareTo 作為排序的核心方法。
CompareTo 的基礎語法:
1A.CompareTo(B)
CompareTo 有以下三項特性:
- 當 A 小於 B 時,輸出 -1。
- 當 A 等於 B 時,輸出 0。
- 當 A 大於 B 時,輸出 1。
在實際應用上,我們可以將自訂的類別或結構帶入 CompareTo 中,原理其實一樣是數值排序。
1static void Main(string[] _)
2{
3 var players = new Player[] {
4 new Player(4),
5 new Player(8),
6 new Player(7),
7 new Player(6),
8 new Player(3)
9 };
10 Array.Sort(players, (a, b) => a.Level.CompareTo(b.Level));
11 Console.WriteLine($"{string.Join(", ", players.Select(x => x.Level))}");
12 // Output:
13 // 3, 4, 6, 7, 8
14
15 Console.ReadKey();
16}
17
18public struct Player
19{
20 public int Level { get; set; }
21 public Player(int level) => this.Level = level;
22}