lambda表达式
学习参考
lambda简介
lambda运算符:所有的lambda表达式都是用新的lambda运算符 "
=>
",可以叫他,“转到
”或者 “成为
”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。lambda 表达式是一个可用于创建委托或表达式树类型的匿名函数
lambda表达式:
1.一个参数:param=>expr
2.多个参数:(x, y) => x == y
3.显式指定类型:(int x, string s) => s.Length > x
4.使用空括号指定零个输入参数:() => SomeMethod()
示例1
例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的值计算的。 如下面的示例所示,可以将此表达式传递给委托类型:
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
示例2 多参数
//委托 逛超市
delegate int GuangChaoshi(int a, int b);
static void Main(string[] args)
{
GuangChaoshi gwl = (p, z) => z - (p + 10);
Console.WriteLine(gwl(10, 100) + ""); //打印80,z对应参数b,p对应参数a
Console.ReadKey();
}
示例2.1 lambda主体运算复杂
/// <summary>
/// 委托逛超市
/// </summary>
/// <param name="a">花费</param>
/// <param name="b">付钱</param>
/// <returns>找零</returns>
delegate int GuangChaoshi(int a, int b);
static void Main(string[] args)
{
GuangChaoshi gwl = (p, z) =>
{
int zuidixiaofei = 10;
if (p < zuidixiaofei)
{
return 100;
}
else
{
return z - p - 10;
}
};
Console.WriteLine(gwl(10, 100) + ""); //打印80,z对应参数b,p对应参数a
Console.ReadKey();
}
委托表达式
示例1
Func<int, string> gwl = p => p + 10 + "--返回类型为string";
Console.WriteLine(gwl(10) + ""); //打印‘20--返回类型为string’,z对应参数b,p对应参数a
Console.ReadKey();
示例2
static void Main(string[] args)
{
Func < int, int, bool > gwl = (p, j) =>
{
if(p + j == 10)
{
return true;
}
return false;
};
Console.WriteLine(gwl(5, 5) + ""); //打印‘True’,z对应参数b,p对应参数a
Console.ReadKey();
}
说明:从这个例子,我们能看到,p为int类型,j为int类型,返回值为bool类型。
示例3
将委托实例化为 Func<int,bool> myFunc,其中 int 是输入参数,bool 是返回值。 始终在最后一个类型参数中指定返回值。 Func<int, string, bool> 定义包含两个输入参数(int 和 string)且返回类型为 bool 的委托。 在调用下面的 Func 委托时,该委托将返回 true 或 false 以指示输入参数是否等于 5:
Func<int, bool> myFunc = x => x == 5;
bool result = myFunc(4); // returns false of course
示例4
当参数类型为 Expression
时,您也可以提供 Lambda 表达式,例如在 System.Linq.Queryable 内定义的标准查询运算符中。 如果指定 Expression 参数,Lambda 将编译为表达式树。 此处显示了一个标准查询运算符, Count 方法:
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);
lambda表达式树
示例1
/// <summary>
/// 表达树
/// </summary>
public void ExpressioTest()
{
//创建一个表达式树中的参数,作为一个节点
Expression f = Expression.Constant(2);
Expression s = Expression.Constant(3);
Expression test = Expression.Add(f, s);
Console.WriteLine(test);
}
示例2
演示如何让 Visual C# 编译器创建一个表示 lambda 表达式 num => num < 5 (C#) 或 Function(num) num < 5 (Visual Basic) 的表达式树。
Expression<Func<int, bool>> lambda = num => num < 5;
示例3 编译表达式
[Expression< TDelegate> ]类型提供 Compile 方法,该方法将表达式树表示的代码编译成一个可执行委托。
// 创建表达式树
Expression < Func < int, bool >> expr = num => num < 5;
// 将表达式树编译为委托。
Func < int, bool > result = expr.Compile();
// 调用委托并将结果写入控制台。
Console.WriteLine(result(4));
// Prints True.
//还可以使用简化的语法
//编译并运行表达式树。.
//下面的行可以替换前面的两个语句。
Console.WriteLine(expr.Compile()(4));
Console.ReadKey();
// Also prints True.