Lambda
Lambda一般分为
-
表达式 lambda,表达式为其主体:
(input-parameters) => expression
-
语句 lambda,语句块作为其主体:
(input-parameters) => { <sequence-of-statements> }
input-parameters(输入参数)
- 当参数个数=0时,用空()表示
- 当且仅当参数个数=1时,()可省略
- 当参数个数>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;
});
}
}