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

發表日期:
2022.05.23
/
分類:
Dev
在寫程式時我們常常會用到陣列來儲存與處理多筆相同類型的資料,當我們需要將陣列進行排序時將會使用到 Array.Sort 與 CompareTo 兩個核心方法。 Array.Sort var example = new int[] { 1, 2, 3, 4, 5,

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

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