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