C# List<T> 排序
C# List<T>有兩種排序方式,Sort/Reverse vs. OrderBy/OrderByDescending(LINQ),兩種使用方式各有優缺點。
本次介紹第一種Sort/Reverse,相對於LINQ會對列表內容直接排序且不需要重新賦值,通常是用來重新排序一個列表,而不是像LINQ用來遍歷(foreach)集合。
另外如果是自訂類別(class/struct)則需要自行實作比較器(Comparison/IComparer…),使用上就沒有LINQ來的方便。
List.Sort()/Reverse() 用法
如果List是int、string…等內建實值類型,因為C#已經實作了比較器,可以用.Sort()
或.Reverse()
來升降冪排序。
List<int> intList = new List<int>() { 0, 2, 1 };
intList.Sort(); //升冪排序 0,1,2
intList.Reverse(); //降冪排序 2,1,0
List<string> strList = new List<string>() { "c", "b", "a" };
strList.Sort(); //升冪排序 a,b,c
strList.Reverse(); //降冪排序 c,b,a
List.Sort(Comparison<T> comparison)
前面的例子因為是內建的實值類型,但當泛型<T>是自定義的類別(class)或結構(struct)時,就需要自己動手來了!
如果只要以其中一項屬性排序,最簡潔的做法是使用Lambda實作委派Comparison<T>
,下面有個自訂的類別Item:
class Item
{
public int Number { get; set; } = 0;
public string Text { get; set; } = string.Empty;
}
在排序時,可以這樣寫:
不同的地方是降冪要在前面加上負號(-
),讓比較器返回的值相反。
List<Item> itemlist = new List<Item>();
itemlist.Sort((x, y) => x.Number.CompareTo(y.Number)); //以Number升冪
itemlist.Sort((x, y) => -x.Number.CompareTo(y.Number)); //以Number降冪
itemlist.Sort((x, y) => x.Text.CompareTo(y.Text)); //以Text升冪
itemlist.Sort((x, y) => -x.Text.CompareTo(y.Text)); //以Text降冪
測試結果正確
![List.Sort測試](https://blog.cianworks.com/wp-content/uploads/2024/02/list-sort-test.png)
如果需要進一步實作排序的委派,可以參考Comparison<T>。
發佈留言