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

.NET 迭代器新思路:List.ForEach、ConvertAll、FindAll 與 Lambda 表達式實戰

     編輯:關於.NET

從 foreach 到方法鏈:思維轉變

傳統 foreach 需手動管理目標集合、迴圈變數、添加邏輯。.NET 2.0+ List<T> 內建高階方法,配合匿名委派/C# 3.0 Lambda,實現聲明式資料處理。

核心方法速查

方法用途委派簽名
ForEach(Action<T>)遍歷執行動作void Act(T item)
ConvertAll<TOutput>(Converter<T,TOutput>)轉換元素類型,回傳新 ListTOutput Convert(T item)
FindAll(Predicate<T>)篩選符合條件元素,回傳新 Listbool Match(T item)
Find(Predicate<T>)回傳第一個符合元素bool Match(T item)
FindLast/FindLastIndex反向查找bool Match(T item)
Exists/Predicate<T>判斷是否存在符合元素bool Match(T item)
TrueForAll/Predicate<T>判斷所有元素是否符合bool Match(T item)

進化演示:元素乘 2 並存新集合

傳統寫法

int[] datas = {1,3,2,5,7,94,1,8,42,74,8};
ArrayList src = new ArrayList(datas);
ArrayList dest = new ArrayList();
foreach (object obj in src)
    dest.Add(((int)obj) * 2);

List + 匿名委派

List src = new List(datas);
List dest = src.ConvertAll(delegate(int val) { return val * 2; });

List + Lambda(C# 3.0+)

List src = new List(datas);
List dest = src.ConvertAll(val => val * 2); // 一行搞定!

自訂泛型集合實現鏈式操作

繼承 ArrayList 或實作 IList<T>,注入三大核心委派:

public delegate void ForEachAction(T val);
public delegate R ConvertFunc(T val);
public delegate bool FilterFunc(T val);

public class MyList : ArrayList
{
    public MyList() { }
    public MyList(ICollection c) : base(c) { }

    // 遍歷執行,回傳 this 支援鏈式
    public MyList ForEach(ForEachAction action)
    {
        foreach (object obj in this) action((T)obj);
        return this;
    }

    // 轉換並回傳新 MyList
    public MyList ConvertAll(ConvertFunc converter)
    {
        MyList result = new MyList();
        foreach (object obj in this) result.Add(converter((T)obj));
        return result;
    }

    // 篩選並回傳新 MyList
    public MyList FindAll(FilterFunc filter)
    {
        MyList result = new MyList();
        foreach (object obj in this) if (filter((T)obj)) result.Add(obj);
        return result;
    }
}

鏈式調用實戰:列印 → 乘2 → 篩選>10 → 列印

int[] datas = {1,3,2,5,7,94,1,8,42,74,8};
MyList list = new MyList(datas);

list.ForEach(val => Console.Write("{0}\t", val))           // 列印原始
    .ConvertAll(val => val * 2)                            // 轉換
    .FindAll(val => val > 10)                              // 篩選
    .ForEach(val => Console.Write("{0}\t", val));          // 列印結果

// 輸出:
// 1	3	2	5	7	94	1	8	42	74	8	
// 94	42	74	16	20	188	2	16	84	148	16

Lambda 表達式語法精要

形式範例說明
單參數隱式型別x => x * 2編譯器推斷 x 為 int
多參數(x, y) => x + y括號必要
語句主體x => { Console.WriteLine(x); return x * 2; }大括號需显式 return
無參數() => DateTime.Now空括號

Lambda 本質是匿名方法的語法糖,編譯器自動生成委派實例。捕獲外部變數時形成閉包,延長變數生命週期需注意。

效能與適用性權衡

  • 優點:代碼簡潔、意圖明確、可組合、支援並行化(PLINQ/.NET 4+)。
  • 缺點:鏈式調用產生中間集合,記憶體開銷大;複雜邏輯單一 foreach 更高效。
  • 建議:中小資料集(<10萬筆)優先可讀性;大資料/高頻路徑用 for/foreach 或 Span/Memory 優化。

總結

掌握 List<T> 高階方法與 Lambda,能將集合操作從「如何迭代」提升至「做什麼轉換/篩選」。這正是函數式思維在 C# 的實踐——資料流管道化。下一步可探索 LINQ、PLINQ、更豐富的 IEnumerable<T> 擴充方法,構建更強大的資料處理管線。

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