2024-10-18
轉(zhuǎn)自知乎 羅澤南
Lambda 表達(dá)式在 C# 中用于簡(jiǎn)化匿名方法的書(shū)寫(xiě)形式。它廣泛用于 LINQ 查詢(xún)、事件處理、委托等場(chǎng)景。下面通過(guò)幾個(gè)詳細(xì)的案例展示 lambda 表達(dá)式的各種用法。
最基本的 Lambda 表達(dá)式通常是用于表示一個(gè)簡(jiǎn)單的函數(shù)或委托。在下面的例子中,我們定義了一個(gè)委托 Func<int, int>
,并使用 Lambda 表達(dá)式為它賦值。
using System; class Program{ static void Main() { // Lambda 表達(dá)式:接收一個(gè)參數(shù) x,返回 x 的平方 Func<int, int> square = x => x * 2; int result = square(5); // 計(jì)算 5 的平方 Console.WriteLine(result); // 輸出 10 } }
解釋?zhuān)?/span>
Func<int, int>
表示一個(gè)接收一個(gè) int
參數(shù)并返回一個(gè) int
值的委托。
x => x * 2
是 Lambda 表達(dá)式,其中 x
是輸入?yún)?shù),x * 2
是返回值。
Lambda 表達(dá)式在 LINQ 查詢(xún)中非常常見(jiàn)。下面的例子展示如何使用 Lambda 表達(dá)式過(guò)濾并操作集合中的數(shù)據(jù)。
using System;using System.Collections.Generic;using System.Linq; class Program{ static void Main() { List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 使用 Lambda 表達(dá)式來(lái)篩選出所有的偶數(shù) IEnumerable<int> evenNumbers = numbers.Where(x => x % 2 == 0); Console.WriteLine("Even numbers:"); foreach (var number in evenNumbers) { Console.WriteLine(number); // 輸出 2, 4, 6, 8, 10 } } }
解釋?zhuān)?/span>
numbers.Where(x => x % 2 == 0)
使用 Lambda 表達(dá)式 x => x % 2 == 0
過(guò)濾出所有偶數(shù)。
x => x % 2 == 0
表示對(duì)于集合中的每一個(gè)元素 x
,判斷其是否為偶數(shù),如果是,則保留該元素。
Lambda 表達(dá)式也可以用作事件處理器的簡(jiǎn)寫(xiě)形式。通常在添加事件處理器時(shí)可以使用匿名方法或 Lambda 表達(dá)式。
using System; class Program{ static void Main() { // 使用 Lambda 表達(dá)式來(lái)處理按鈕點(diǎn)擊事件 Button button = new Button(); button.Click += (sender, e) => Console.WriteLine("Button clicked!"); // 模擬按鈕點(diǎn)擊 button.OnClick(); } } class Button{ public event EventHandler Click; public void OnClick() { // 觸發(fā)事件 Click?.Invoke(this, EventArgs.Empty); } }
解釋?zhuān)?/span>
button.Click += (sender, e) => Console.WriteLine("Button clicked!");
使用 Lambda 表達(dá)式直接添加一個(gè)事件處理器,簡(jiǎn)化了事件處理的書(shū)寫(xiě)。
這里,Lambda 表達(dá)式 (sender, e)
對(duì)應(yīng) EventHandler
委托的參數(shù)。
Lambda 表達(dá)式不僅可以用于簡(jiǎn)單的表達(dá)式,它還支持多參數(shù)和多行代碼。我們可以使用花括號(hào) {}
來(lái)定義多行 Lambda 表達(dá)式。
using System; class Program{ static void Main() { // 定義一個(gè)接受兩個(gè)參數(shù)的 Lambda 表達(dá)式,并包含多行代碼 Func<int, int, int> addAndMultiply = (x, y) => { int sum = x + y; return sum * 2; // 返回和的兩倍 }; int result = addAndMultiply(3, 4); Console.WriteLine(result); // 輸出 14 } }
解釋?zhuān)?/span>
(x, y) => { int sum = x + y; return sum * 2; }
是一個(gè)包含多行代碼的 Lambda 表達(dá)式。
通過(guò)花括號(hào),我們可以在 Lambda 表達(dá)式中編寫(xiě)復(fù)雜的邏輯。
Action<T>
:用于不返回值的委托。
Predicate<T>
:用于返回 bool
類(lèi)型的委托,通常用于條件檢查。
using System;using System.Collections.Generic; class Program{ static void Main() { // 使用 Action Lambda 表達(dá)式來(lái)輸出消息 Action<string> greet = message => Console.WriteLine(message); greet("Hello, World!"); // 輸出 Hello, World! // 使用 Predicate Lambda 表達(dá)式來(lái)檢查數(shù)字是否為正 Predicate<int> isPositive = x => x > 0; List<int> numbers = new List<int> { -1, 2, -3, 4, 5 }; List<int> positiveNumbers = numbers.FindAll(isPositive); Console.WriteLine("Positive numbers:"); foreach (var number in positiveNumbers) { Console.WriteLine(number); // 輸出 2, 4, 5 } } }
解釋?zhuān)?/span>
Action<string> greet = message => Console.WriteLine(message);
使用 Lambda 表達(dá)式作為 Action
委托,用于不返回值的操作。
Predicate<int> isPositive = x => x > 0;
使用 Lambda 表達(dá)式作為 Predicate
委托,用于條件判斷。
表達(dá)式樹(shù)用于將 Lambda 表達(dá)式轉(zhuǎn)換為數(shù)據(jù)結(jié)構(gòu),可以在運(yùn)行時(shí)分析和修改。這個(gè)功能主要用于動(dòng)態(tài) LINQ 查詢(xún)。
using System; using System.Linq.Expressions; class Program{ static void Main() { // 創(chuàng)建一個(gè) Lambda 表達(dá)式的表達(dá)式樹(shù) Expression<Func<int, int>> expression = x => x * x; // 編譯并執(zhí)行表達(dá)式 Func<int, int> square = expression.Compile(); Console.WriteLine(square(5)); // 輸出 25 } }
解釋?zhuān)?/span>
Expression<Func<int, int>>
創(chuàng)建了一個(gè)表達(dá)式樹(shù),而不是普通的 Lambda 表達(dá)式。
expression.Compile()
將表達(dá)式樹(shù)編譯成可執(zhí)行代碼。
Lambda 表達(dá)式 是簡(jiǎn)化匿名方法的一種方式,可以在需要委托、事件處理或 LINQ 查詢(xún)的地方使用。
它可以用于簡(jiǎn)單的單行表達(dá)式,也可以用于復(fù)雜的多參數(shù)、多行代碼。
在 C# 中,Lambda 表達(dá)式與 Func<>
、Action<>
、Predicate<>
、事件處理和表達(dá)式樹(shù)等結(jié)合使用時(shí)非常靈活強(qiáng)大。
這些案例展示了 Lambda 表達(dá)式在不同場(chǎng)景中的使用方式,讓代碼更簡(jiǎn)潔、直觀。