1. 程式人生 > >Lambda表示式、Lambda表示式樹

Lambda表示式、Lambda表示式樹

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
    }
}