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

C# Lambda 表達式入門:從匿名委派到 LINQ 查詢的基石

     編輯:關於C#

演進脈絡:委派 → 匿名方法 → Lambda

版本語法範例
C# 1.0具名委派delegate int Op(int x, int y); Op add = AddMethod;
C# 2.0匿名方法Op add = delegate(int x, int y) { return x + y; };
C# 3.0Lambda 表達式Op add = (x, y) => x + y;

=> 讀作「goes to」,左邊是參數,右邊是運算式或陳述式區塊。

Lambda 核心語法

// 運算式 Lambda(單一運算式,隱含回傳)
Func add = (x, y) => x + y;
Func isEven = x => x % 2 == 0;

// 陳述式 Lambda(多行,需大括號與 return)
Func addWithLog = (x, y) {
    Console.WriteLine($"Adding {x} + {y}");
    return x + y;
};

// 無參數
Action greet = () => Console.WriteLine("Hello");

// 參數型別可省略(編譯器推斷),或明確指定
Func square = (int x) => x * x;

閉包:捕捉外部變數


int factor = 10;
Func multiply = x => x * factor; // 捕捉 factor
factor = 20;
Console.WriteLine(multiply(5)); // 輸出 100(捕捉的是變數,非值)

注意迴圈變數捕捉陷阱(C# 5.0+ `foreach` 已修正,`for` 仍需留意)。

Func / Action 委派家族

.NET 內建委派型別涵蓋絕大多數情境:

  • Func<TResult> ~ Func<T1..T16, TResult>:有回傳值
  • Action ~ Action<T1..T16>:無回傳值
  • Predicate<T>:Func<T, bool> 別名,常用於條件判斷

LINQ 中的 Lambda:Where 與 Average 範例


var people = new List {
    new Person { Name = "小兵", Age = 23 },
    new Person { Name = "青青", Age = 22 }
};

// Where: IEnumerable 擴充方法,接受 Func
var adults = people.Where(p => p.Age >= 23); // Lambda 傳遞給 predicate 參數

// Average: 接受 Func selector
double avgAge = people.Average(p => p.Age);

編譯器將 Lambda 轉換為委派實例(或運算式樹),傳遞給擴充方法。

運算式樹:Lambda 的另一種面貌


using System.Linq.Expressions;

// 運算式樹:可在執行時分析、修改、編譯
Expression> expr = (x, y) => x + y;
var compiled = expr.Compile(); // 轉為委派
Console.WriteLine(compiled(2, 3)); // 5

// 應用:Entity Framework 將運算式樹轉譯為 SQL
var query = db.Users.Where(u => u.Age > 18); // IQueryable 使用 Expression>

常見模式與最佳實踐

模式範例說明
投影select p => p.Name轉換資料形狀
篩選where p => p.Age > 18條件過濾
排序鍵orderby p => p.LastName指定排序依據
分組鍵group p by p.Department分組依據
副作用list.ForEach(item => Console.WriteLine(item))慎用,違反函數純粹性

總結

Lambda 表達式是 C# 函數式程式設計的核心語法糖,簡化委派撰寫、支援閉包、並為 LINQ、運算式樹、非同步程式設計提供統一的函數抽象。掌握 =>、Func/Action、閉包語意,即可駕馭現代 C# 開發。

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