Lambda表示式、Lambda表示式樹
阿新 • • 發佈:2018-11-28
1.Lambda表示式
基本形式:(input parameters引數) => expression表示式
使用空括號指定零個輸入引數:() => { };
2.Lambda表示式樹
(轉)例子:(https://www.cnblogs.com/yunfeifei/p/3844814.html)
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using UnityEngine; public class Lambda : MonoBehaviour { // Use this for initialization void Start() { //簡單Lambda List<string> citys = new List<string>() { "BeiJing", "ShangHai", "Tianjin", "GuangDong" }; FindCityOld(citys); FindCityNew(citys); //使用Lambda表示式 LambdaFun("BeiJing 2013", s => { if (s.Contains("2013")) { s = s.Replace("2013", "2014"); } return s; }); //Lambda表示式樹 int[] temps = new int[4] { 1, 2, 3, 4 }; LambdaFuns(temps); } void FindCityOld(List<string> citys) { for (int i = 0; i < citys.Count; i++) { if (citys[i].Length > 7) { var result = citys[i]; //Debug.Log(result); break; } } } void FindCityNew(List<string> citys) { var result = citys.First(c => c.Length > 7); //Debug.Log(result); } /// <summary> /// 定義Lambda表示式 /// </summary> /// <param name="str"></param> /// <param name="func"></param> void LambdaFun(string str, Func<string, string> func) { Debug.Log(func(str)); } /// <summary> /// 表示式樹動態建立 /// </summary> /// <param name="args"></param> public void LambdaFuns(int[] strs) { //i*j+w*x //建立一個表示式樹中的引數,作為一個節點,這裡是最下層的節點 ParameterExpression a = Expression.Parameter(typeof(int), "i"); ParameterExpression b = Expression.Parameter(typeof(int), "j"); //這裡i*j,生成表示式樹中的一個節點,比上面節點高一級 BinaryExpression r1 = Expression.Multiply(a, b); ParameterExpression c = Expression.Parameter(typeof(int), "w"); ParameterExpression d = Expression.Parameter(typeof(int), "x"); BinaryExpression r2 = Expression.Multiply(c, d); BinaryExpression result = Expression.Add(r1, r2); //運算兩個中級節點,產生終結點 //Debug.Log(result); Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(result, a, b, c, d); //輸出‘(i,j,w,x)=>((i*j)+(w*x))’,z對應引數b,p對應引數a //Debug.Log(lambda + ""); //將表示式樹描述的lambda表示式,編譯為可執行程式碼,並生成該lambda表示式的委託; Func<int, int, int, int, int> f = lambda.Compile(); //Debug.Log(f(strs[0], strs[1], strs[0], strs[0])); //輸出結果2 } }