[Csharp] Array.Sort 升降序語法與 CompareTo 方法解讀

2022.05.23 / Dev

在寫程式時我們常常會用到陣列來儲存與處理多筆相同類型的資料,當我們需要將陣列進行排序時將會使用到 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 來實作。

在寫程式時我們常常會用到陣列來儲存與處理多筆相同類型的資料,當我們需要將陣列進行排序時將會使用到 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 有以下三項特性:

  1. 當 A 小於 B 時,輸出 -1。
  2. 當 A 等於 B 時,輸出 0。
  3. 當 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}

相關文章

Ted Liou

雲科碩士在讀中,專注於 Unity C#、TouchDesigner 技術。
只要願意以超連結標註本文,歡迎轉載或用於教材製作!