List(Of T) 是 .NET 框架中最常用的泛型集合,提供型別安全、效能優異的動態陣列功能。掌握 ForEach、FindAll、Sort 三大核心方法,能大幅簡化集合操作程式碼。本文以自訂 Bottle 類別為例,完整示範建立、查詢、篩選與排序流程。
Public Class Bottle
Public Property Brand() As String
Public Property Name() As String
Public Property Category() As String
Public Property Size() As Decimal
Public Sub New(brand As String, name As String, category As String, size As Decimal)
Me.Brand = brand
Me.Name = name
Me.Category = category
Me.Size = size
End Sub
End Class
Dim Cabinet As New List(Of Bottle)()
Cabinet.Add(New Bottle("Castle Creek", "Uintah Blanc", "Wine", 750D))
Cabinet.Add(New Bottle("Zion Canyon Brewing Company", "Springdale Amber Ale", "Beer", 355D))
Cabinet.Add(New Bottle("Spanish Valley Vineyards", "Syrah", "Wine", 750D))
Cabinet.Add(New Bottle("Wasatch Beers", "Polygamy Porter", "Beer", 355D))
Cabinet.Add(New Bottle("Squatters Beer", "Provo Girl Pilsner", "Beer", 355D))
ForEach 接受一個 Action(Of T) 委派,對每個元素執行指定邏輯。
Sub DisplayBottle(ByVal b As Bottle)
Console.WriteLine(b.Brand & " - " & b.Name)
End Sub
Cabinet.ForEach(AddressOf DisplayBottle)
輸出:五行品牌-名稱組合。AddressOf 建立委派實例,將方法指標傳遞給 ForEach。
FindAll 接受 Predicate(Of T) 委派,回傳符合條件的新 List(Of T)。
Function FindBeer(ByVal b As Bottle) As Boolean
Return b.Category = "Beer"
End Function
Dim beerList As List(Of Bottle) = Cabinet.FindAll(AddressOf FindBeer)
For Each b As Bottle In beerList
Console.WriteLine(b.Brand & " - " & b.Name)
Next
重點:Predicate(Of T) 回傳 Boolean,邏輯可任意複雜(如價格區間、名稱比對等),FindAll 會建立新清單而不修改原集合。
Sort 提供四種多載,最彈性的是接受 Comparison(Of T) 委派,或實作 IComparer(Of T) 介面。
Private Shared Function SortCabinet(ByVal x As Bottle, ByVal y As Bottle) As Integer
Return x.Category.CompareTo(y.Category) ' Beer 排在 Wine 前
End Function
Cabinet.Sort(AddressOf SortCabinet)
For Each b As Bottle In Cabinet
Console.WriteLine(b.Category & " | " & b.Brand & " - " & b.Name)
Next
注意:Sort 會就地重排原清單,不產生新實例。若需保留原順序,請先 ToList() 複製。
| 多載 | 適用情境 |
|---|---|
Sort() | 元素實作 IComparable(Of T) 時的預設排序 |
Sort(IComparer(Of T)) | 外部比較器,適合複雜/可切換排序邏輯 |
Sort(Comparison(Of T)) | 委派式比較,程式碼最精簡(本文採用) |
Sort(Int32, Int32, IComparer(Of T)) | 部分區間排序(指定起始索引與長度) |
Comparison(Of T) 一行搞定自訂邏輯。善用這三大方法,配合 Lambda 運算式(VB 9+ 支援 Function(b) b.Category = "Beer"),能將集合操作程式碼壓縮 50% 以上,且可讀性極佳。