zoukankan      html  css  js  c++  java
  • 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;
           	});
        }
    }
    
  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/AMzz/p/12713984.html
Copyright © 2011-2022 走看看