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;
       	});
    }
}
posted @ 2020-04-16 16:59  AMzz  阅读(542)  评论(0编辑  收藏  举报
//字体