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)潔、直觀。