Lambda表达式

目录

什么是Lambda表达式

表达式 lambda

lambda 表达式的输入参数

异步 lambda


 

什么是Lambda表达式

使用Lambda表达来创建匿名函数。使用lambda声明运算符=>从其主题中分离lambda参数列表。

表达式 lambda

lambda 表达式的输入参数

lambda表达式可采用以下任意一种形式:

表达式lambda,表达式为其主体:

(input-parameters)=>expression

语句lambda,语句块作为其主体:

(input-parameters)=>{<sequence-of-statements>}

若要创建Lambda表达式,需要在Lambda运算符左侧指定输入参数(如果有),然后在另外一侧输入表达式或语句块

任何Lambda表达式都可以转换为委托类型。Lambda表达式可以转换的委托类型由其参数和返回值的类型定义。如果Lambda表达式不返回值,则可以将其转换为Action委托类型之一;否则,可将其转换为Func委托类型之一

例如,有2个参数且不返回值的Lambda表达式可转换为Action<T1,T2>委托。有一个参数且不返回值的Lambda表达式可转换为Func<T1,TResult>委托,以下示例中,lambda表达式x=>x*x(指定名为x的参数并返回x平方值)将分配给委托类型的变量:

Func<int, int> square = x => x * x;
Console.WriteLine(square(5));
// Output:
// 25

表达式 lambda 还可以转换为表达式树类型,如下面的示例所示:

System.Linq.Expressions.Expression<Func<int, int>> e = x => x * x;
Console.WriteLine(e);
// Output:
// x => (x * x)

可在需要委托类型或表达式树的实例的任何代码中使用 lambda 表达式,例如,作为 Task.Run(Action) 方法的参数传递应在后台执行的代码。 用 C# 编写 LINQ 时,还可以使用 lambda 表达式,如下例所示:

int[] numbers = { 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(x => x * x);
Console.WriteLine(string.Join(" ", squaredNumbers));
// Output:
// 4 9 16 25

如果使用基于方法的语法在 System.Linq.Enumerable 类中(例如,在 LINQ to Objects 和 LINQ to XML 中)调用 Enumerable.Select 方法,则参数为委托类型 System.Func<T,TResult>。 如果在 System.Linq.Queryable 类中(例如,在 LINQ to SQL 中)调用 Queryable.Select 方法,则参数类型为表达式树类型 Expression<Func<TSource,TResult>>。 在这两种情况下,都可以使用相同的 Lambda 表达式来指定参数值。 尽管通过 Lambda 创建的对象实际具有不同的类型,但其使得 2 个 Select 调用看起来类似。

 lambda 表达式的输入参数括在括号中。 使用空括号指定零个输入参数:
Action line = () => Console.WriteLine();

如果 lambda 表达式只有一个输入参数,则括号是可选的:
Func<double, double> cube = x => x * x * x;


两个或更多输入参数使用逗号加以分隔:
Func<int, int, bool> testForEquality = (x, y) => x == y;

有时,编译器无法推断输入参数的类型。 可以显式指定类型,如下面的示例所示:
Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;

异步 lambda

通过使用 async 和 await 关键字,你可以轻松创建包含异步处理的 lambda 表达式和语句。 例如,下面的 Windows 窗体示例包含一个调用和等待异步方法 ExampleMethodAsync的事件处理程序。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        button1.Click += button1_Click;
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        await ExampleMethodAsync();
        textBox1.Text += "\r\nControl returned to Click event handler.\n";
    }

    private async Task ExampleMethodAsync()
    {
        // The following line simulates a task-returning asynchronous process.
        await Task.Delay(1000);
    }
}


你可以使用异步 lambda 添加同一事件处理程序。 若要添加此处理程序,请在 lambda 参数列表前添加 async 修饰符,如下面的示例所示:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        button1.Click += async (sender, e) =>
        {
            await ExampleMethodAsync();
            textBox1.Text += "\r\nControl returned to Click event handler.\n";
        };
    }

    private async Task ExampleMethodAsync()
    {
        // The following line simulates a task-returning asynchronous process.
        await Task.Delay(1000);
    }
}

可参考代码链接

lambda表达式,示例参考-互联网文档类资源-CSDN文库icon-default.png?t=M0H8https://download.csdn.net/download/m0_58717895/78131390

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值