什么是lambda表达式
Lambda 表达式,是一种简化的匿名函数,可用于创建委托或表达式目录树。其次,也可以将 Lambda 表达式作为参数进行传递,或者将它作用于函数调用值调用后返回的一个函数来使用。经常在 LINQ 中使用 Lambda 表达式。
Lambda的组成
Lambda表达式
表达式在 => 运算符右侧,称“lambda 表达式”。lambda 表达式常用于 LINQ 和构建表达式树,它也允许返回结果。
基本形式:( 输入参数 ) => 表达式 。
- ( ) => true;
- x => x == 1;
- (x) => x == 1;
- (x, y) => x == y;
当 lambda 表达式有且只有一个输入参数的时侯,括号(“()”)才是可选的。 括号内存在多个输入参数时使用“,”进行分割。
也可以选择显式指定类型,一般只有在编译器难以或无法准确推断输入类型的时候。
Lambda语句
lambda 语句和上面的 lambda 表达式相比,只是多了个大括号(“{ }”)。
基本形式:( 输入参数 ) => { 表达式 } 。
异步Lambda
通过 async 和 await 关键字,我们可以很简单并快速的创建包含异步处理的 lambda 表达式和语句。
- Async
- Await
在Linq中使用Lambda
许多 LINQ 中的参数都是一种委托类型的参数,如 Func<T, TResult>,可以定义输入参数以及返回类型。
public delegate TResult Func<TArg0, TResult>(TArg0 arg0)
Func<int, bool> 表示:int 为输入参数,bool 为返回值。
Func<int, int, bool> 表示:2个 int 为输入参数,一个 bool 为返回值。
示例:
- Func<int, bool> myFunc = x => x == 250;
- var result = myFunc(1314);
C# 的编译器可以自动推断输入参数的类型,即便是多个输入参数,当然,也可以选择显式指定。
Lambda中的类型推断
- var nums = new[] { 2, 5, 0 };
- var query = nums.Count(x => x > 2);
- var query2 = nums.Count<int>(x => x < 2);
编译器会根据 Lambda 主体、参数的委托类型以及 C# 语言规范和其它等一些因素,对所写的 Lambda 进行类型推断。
由于源数据是一个 int 数组,即我要查的数据为 IEnumerable<int> 类型,编译器在这里自动推断元素为 int 类型,意味着 Count 方法内的 x 你可以通过 “.” 在 VS 中显示对应 int 类型的属性和方法。
Lambda的特点
- Lambda 中包含输入参数的数量,必须与委托类型包含的参数数量一致。
- Lambda 中的每个输入参数,必须都能够通过隐式转换为其对应的委托参数类型
- Lambda 中的返回值(如果有),必须能够隐式转换为委托的返回类型
实例1
效果图
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using Console = System.Console;
namespace Lambda表达式
{
class Program
{
static void Main(string[] args)
{
{
//2.利用委托实现两整数相乘并输出他们的积。(10分)
//Func<int, int, int> func = Multy;
Func<int, int, int> func = (x, y) => x * y;
Console.WriteLine(func(10, 5));
}
{
//利用匿名方法实现两整数相乘并输出他们的积。(10分)
Func<int, int, int> func = (x, y) => x * y;
Console.WriteLine(func(10, 5));
}
{
//在sumClass类中实现两个数相加并返回和T sum(T num1,T num2)
sumClass<decimal> sum = new sumClass<decimal>();
Console.WriteLine(sum.Sum(100.5m, 1.5m));
}
Console.ReadKey();
}
static int Multy(int x, int y)
{
return x * y;
}
}
}
sumClass:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lambda表达式
{
class sumClass<T> where T: struct
{
public T Sum(T num1, T num2)
{
dynamic d1 = num1;
dynamic d2 = num2;
return d2 + d1;
}
}
}