首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

VB.NET 泛型 List 實戰:ForEach、FindAll 與 Sort 進階應用

     編輯:更多程式設計知識

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 — 遍歷集合執行動作

ForEach 接受一個 Action(Of T) 委派,對每個元素執行指定邏輯。

步驟 1:撰寫委派目標方法

Sub DisplayBottle(ByVal b As Bottle)
    Console.WriteLine(b.Brand & " - " & b.Name)
End Sub

步驟 2:呼叫 ForEach

Cabinet.ForEach(AddressOf DisplayBottle)

輸出:五行品牌-名稱組合。AddressOf 建立委派實例,將方法指標傳遞給 ForEach。

方法二:FindAll — 依條件篩選子集合

FindAll 接受 Predicate(Of T) 委派,回傳符合條件的新 List(Of T)。

步驟 1:定義篩選條件方法

Function FindBeer(ByVal b As Bottle) As Boolean
    Return b.Category = "Beer"
End Function

步驟 2:執行篩選並處理結果

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 — 自訂排序規則

Sort 提供四種多載,最彈性的是接受 Comparison(Of T) 委派,或實作 IComparer(Of T) 介面。

自訂比較方法(依 Category 排序)

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 多載對照

多載適用情境
Sort()元素實作 IComparable(Of T) 時的預設排序
Sort(IComparer(Of T))外部比較器,適合複雜/可切換排序邏輯
Sort(Comparison(Of T))委派式比較,程式碼最精簡(本文採用)
Sort(Int32, Int32, IComparer(Of T))部分區間排序(指定起始索引與長度)

總結

  • ForEach:唯讀遍歷、副作用操作(列印、寫入檔案、UI 更新)。
  • FindAll:宣告式篩選,回傳新清單,原資料不變。
  • Sort:就地排序,配合 Comparison(Of T) 一行搞定自訂邏輯。

善用這三大方法,配合 Lambda 運算式(VB 9+ 支援 Function(b) b.Category = "Beer"),能將集合操作程式碼壓縮 50% 以上,且可讀性極佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved