Lambda 表達式可視為 C# 2.0 匿名方法的進化版本。在 C# 2.0 中,我們透過 delegate 關鍵字編寫內聯程式碼區塊,例如篩選列表中的偶數:
List<int> evenNumbers = list.FindAll(delegate(int i) { return (i % 2) == 0; });
雖然匿名方法減少了「極小函數」的宣告,但在語法上仍顯得冗長。
C# 3.0 引入 Lambda 運算子 =>,讓程式碼更加直觀:
var evenNumbers = list.FindAll(i => (i % 2) == 0);
此處 i => (i % 2) == 0 即為 Lambda 表達式,參數型別由編譯器自動推斷,大幅提升可讀性。更複雜的範例:
fruit.FilterBy((string name, double price) => name == "banana" && price < 2.00);
更強大的是 System.Linq.Expressions 命名空間提供的表達式樹功能。它允許在執行時將 Lambda 表達式視為資料結構進行分析、修改或動態編譯:
using System.Linq.Expressions;
Expression<Func<int, bool>> filter = n => (n * 3) < 5;
BinaryExpression lt = (BinaryExpression)filter.Body;
BinaryExpression mult = (BinaryExpression)lt.Left;
ParameterExpression param = (ParameterExpression)mult.Left;
ConstantExpression three = (ConstantExpression)mult.Right;
ConstantExpression five = (ConstantExpression)lt.Right;
Console.WriteLine("({0} ({1} {2} {3}) {4})",
lt.NodeType, mult.NodeType, param.Name, three.Value, five.Value);
// 輸出:(LT (Multiply n 3) 5)
這項技術讓我們能動態解析查詢邏輯、建構動態 LINQ 查詢,或實現規則引擎等進階場景,極大增強了程式的靈活性。