傳統 foreach 需手動管理目標集合、迴圈變數、添加邏輯。.NET 2.0+ List<T> 內建高階方法,配合匿名委派/C# 3.0 Lambda,實現聲明式資料處理。
| 方法 | 用途 | 委派簽名 |
|---|---|---|
ForEach(Action<T>) | 遍歷執行動作 | void Act(T item) |
ConvertAll<TOutput>(Converter<T,TOutput>) | 轉換元素類型,回傳新 List | TOutput Convert(T item) |
FindAll(Predicate<T>) | 篩選符合條件元素,回傳新 List | bool 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) |
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 src = new List(datas);
List dest = src.ConvertAll(delegate(int val) { return val * 2; });
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;
}
}
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
| 形式 | 範例 | 說明 |
|---|---|---|
| 單參數隱式型別 | x => x * 2 | 編譯器推斷 x 為 int |
| 多參數 | (x, y) => x + y | 括號必要 |
| 語句主體 | x => { Console.WriteLine(x); return x * 2; } | 大括號需显式 return |
| 無參數 | () => DateTime.Now | 空括號 |
Lambda 本質是匿名方法的語法糖,編譯器自動生成委派實例。捕獲外部變數時形成閉包,延長變數生命週期需注意。
foreach 更高效。for/foreach 或 Span/Memory 優化。掌握 List<T> 高階方法與 Lambda,能將集合操作從「如何迭代」提升至「做什麼轉換/篩選」。這正是函數式思維在 C# 的實踐——資料流管道化。下一步可探索 LINQ、PLINQ、更豐富的 IEnumerable<T> 擴充方法,構建更強大的資料處理管線。