Lambda表达式(C# 编程指南)
System.Linq.Expressions
示例
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace ConsoleApp3 { class Program { delegate int del(int i); delegate int del1(int x, int y); delegate int del2(); delegate void del3(string s); private static Action action; private static int k = 9; static void Main(string[] args) { /* Lambda 表达式: () => SomeMethod(); //使用括号指定0个参数 x => x * x; //1个参数 (x1, x2) => x1 * x2; //多个参数时用括号括起来 (int x1, int x2) => x1 * x2; //编译器无法推断输入类型时,可以显示指定参数类型 */ del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 Console.WriteLine("j={0}", j); del1 myDelegate1 = (x, y) => x * y; int n = myDelegate1(4, 5); Console.WriteLine("n={0}", n); del2 myDelegate2 = () => SomeMethod(); int m = myDelegate2(); Console.WriteLine("m={0}", m); //条件查询 int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; int oddNumbers = numbers.Count(p => p % 2 == 1); Console.WriteLine("oddNumbers={0}", oddNumbers); /* Lambda 语句 */ del3 myDelegate3 = s => { string s1 = s + " World"; Console.WriteLine(s1); }; myDelegate3("Hello"); //异步事件 action += async () => { await ExampleMethodAsync(); }; action(); //表达式树 参见 https://www.cnblogs.com/ashleyboy/p/4831064.html //委托res引用返回x+1的方法 Func<int, int> res = x => x + 1; //表达式树exp引用描述表达式x=>x+1的数据结构 Expression<Func<int, int>> exp = x => x + 1; //将表达式树描述的lambda表达式编译为可执行代码,并生成表示该lambda表达式的委托 Func<int, int> delf = exp.Compile(); int q = delf(5); Console.WriteLine("q={0}", q); //通过API创建表达式树 ParameterExpression param = Expression.Parameter(typeof(int), "x"); ConstantExpression value = Expression.Constant(1, typeof(int)); BinaryExpression body = Expression.Add(param, value); //public delegate TResult Func<in T, out TResult>(T arg); Expression<Func<int, int>> lambdatree = Expression.Lambda<Func<int, int>>(body, param); Console.WriteLine("参数param:{0}", param); Console.WriteLine("描述body:{0}", body); Console.WriteLine("表达式树:{0}", lambdatree); Func<int, int> delt = lambdatree.Compile(); int t = delt(8); Console.WriteLine("t={0}", t); //条件表达式 int num = 100; Expression conditionExpr = Expression.Condition( Expression.Constant(num > 10), Expression.Constant("num is greater than 10"), Expression.Constant("num is smaller than 10") ); Console.WriteLine(conditionExpr.ToString()); Console.WriteLine(Expression.Lambda<Func<string>>(conditionExpr).Compile()()); Console.Read(); } private static int SomeMethod() { return k; } private static async Task ExampleMethodAsync() { await Task.Delay(1000);//.NET 4.5+ Console.WriteLine("ExampleMethodAsync"); } } }
运行测试