• C#中的Lambda


    Lambda

    Lambda一般分为

    • 表达式 lambda,表达式为其主体:

      (input-parameters) => expression
      
    • 语句 lambda,语句块作为其主体:

      (input-parameters) => { <sequence-of-statements> }
      

    input-parameters(输入参数)

    1. 当参数个数=0时,用空()表示
    2. 当且仅当参数个数=1时,()可省略
    3. 当参数个数>1时,在()内用","分隔
    static void Main(string[] args)
    {
    	Action line = ()=>Console.WriteLine("This is a Lambda expression."); //输入参数个数为0时,括号不可省略
    	Func<int,int> test1 = x => x+2;	//输入参数个数为1时,,等价于(x)=>x+2,括号可省略,x作为传入参数int,x+2作为传出参数int
    	Func<int, int, bool> test2 = (x, y) => x == y;//输入参数个数>1时,x,y分别作为传入参数int,表达式作为传出参数bool
    	Func<int,int,bool>test3=(x,y)=>		//多条语句组成语句块
    	{
        	if(x>y)
        	{
            	return true;
            }
        	else
        	{
            	return false;
        	}
    	};
    
    	Func<int, string, bool> islonger = (int x, string s) => s.Length > x;//有时,编译器无法推断输入类型。 可以显式指定类型
    	
        //使用
       line();
       Console.WriteLine("1+2=" + test1(1));
       Console.WriteLine("1==2 " + test2(1, 2));
       Console.WriteLine("2>1 " + test3(2, 1));
       Console.WriteLine("sizeof(hello!)>5 " + islonger(5,"hello!"));
       /*Output:
        This is a Lambda expression.
    	1+2=3
    	1==2 False
    	2>1 True
    	sizeof(hello!)>5 True
    	*/
    
    }
    

    1.在 is 或 as 运算符的左侧不允许使用 Lambda 表达式。

    2.输入参数类型必须全部为显式或全部为隐式

    常用于

    • 将要执行的代码传递给异步方法,例如 Task.Run(Action)。
    • 编写 LINQ 查询表达式。
    • 创建表达式树。

    含标准查询运算符的 lambda

    ●from子句:指定查询操作的数据源和范围变量。

    ●select子句:指定查询结果的类型和表现形式。

    ●where子句:指定筛选元素的逻辑条件。

    ●let子句:引入用来临时保存查询表达式中的字表达式结果的范围变量。

    ●orderby子句:对查询结果进行排序操作,包括升序和降序。

    ●group子句:对查询结果进行分组。

    ●into子句:提供一个临时标识符。join子句、group子句或select子句可以通过该标识符引用查询操作中的中坚结果。

    ●join子句:连接多个用于查询操作的数据源。

    struct game
    {
    	public string name;
    	public float price;
    	public gameType type;
    	public game(string n,float p,gameType t)
    	{
    		name = n;
             price = p;
             type = t;
        }
    }
    
    enum gameType
    {
    RPG,FPS,ACT
    }
    
    static void Main(string[] args)
    {
    	List<game> games = new List<game>();
    	games.Add(new game("Devil May Cry", 300, gameType.ACT));
    	games.Add(new game("CS", 50, gameType.FPS));
    	games.Add(new game("Octopath Traveler", 400, gameType.RPG));
    
    	var RPGGameNum = games.Count(n => n.type == gameType.RPG);//获取满足条件的个数
    	var HighestPrice = games.Max(n => n.price);//获取满足条件的最大值
    	var avgPrice = games.Average(n => n.price);//获取满足条件的平均值
    
    	Console.WriteLine("It has "+RPGGameNum+ " RPGGame");
    	Console.WriteLine("The highestPrice is "+HighestPrice);
    	Console.WriteLine("All games' avgPrice is " + avgPrice);
    	//Output:
            //It has 1 RPGGame
    	//The highestPrice is 400
    	//All games' avgPrice is 250
    }
    
    

    具体可见:https://www.cnblogs.com/genesis/p/4908612.html

    还有lambda关于async 和 await的使用的知识,由于还没接触多线程,我就暂时咕掉了。

    总的来说,我具体使用lambda时多数用于委托函数参数,如下面一个在Unity音乐管理的委托回调

    /// <summary>
    /// 播放音效
    /// </summary>
    /// <param name="name"></param>
    /// <param name="isLoop">是否循环</param>
    /// <param name="callBack">返回AudioSource用于控制</param>
    public void PlaySoundMusic(string name,bool isLoop,UnityAction<AudioSource>callBack=null)
    {
        if(soundObj==null)
        {
        	soundObj = new GameObject("Sound");
        }
        //用lambda造委托回调函数
        ResMgr.GetInstance().LoadAsync<AudioClip>("Music/Sound/" + name, (clip) =>
        {
            。。。。。。
            if (callBack != null)
               callBack(source);
        });
    }
    //测试部分
    private AudioSource audio;
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
        	//用lambda造委托回调函数
           	MusicMgr.GetInstance().PlaySoundMusic("dog", false,(source)=>  
           	{
               	audio = source;
           	});
        }
    }
    
  • 相关阅读:
    结婚也可以2.0!
    最近读书清单
    Win7旗舰版中的IIS配置asp.net的运行环境
    Google Chrome浏览器
    MySQL到NoSQL:数据的重思和查询方式的转换
    sqlserver游标概念与实例全面解说
    高效管理ASP.NET的JavaScript库
    如何提取网页中的flash
    如何手动启动tomcat
    tomcat单词缩写
  • 原文地址:https://www.cnblogs.com/AMzz/p/12713984.html
Copyright © 2020-2023  润新知