目录
什么是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文库https://download.csdn.net/download/m0_58717895/78131390