19 LINQ2: lambda是怎么来的

58 阅读1分钟

1.委托变量不仅可以指向普通方法,还可以指向匿名方法。

Func<int, int, string> f1 = delegate (int i1, int i2) {
    return $"{i1}+{i2}={i1 + i2}";
};
string s = f1(1, 2);

2.匿名方法可以写成lambda表达式

Func<int, int, string> f1 = (i1,i2) =>{
    return $"{i1}+{i2}={i1 + i2}";
};

可以省略参数数据类型,因为编译能根据委托类型推断出参数的类型,用=>引出来方法体。

3.如果委托没有返回值,且方法体只有一行代码,可省略 {}

Action<int, string> a1 = (age, name) => Console.WriteLine($"年龄{age},姓名{name}");
a1(18, "qz");

4.如果=>之后的方法体中只有一行代码,且方法有返回值,那么可以省略方法体的{}以及return。

Func<int, int, string> f1 = (i1, i2) => $"{i1}+{i2}={i1 + i2}";

5.如果只有一个参数,参数的()可以省略。

Action<string> f1 = s => Console.WriteLine(s);
Func<int, bool> f2 = i => i > 5;

反推回去

//Action<string> f1 = s => Console.WriteLine(s);
//Func<int, bool> f2 = i => i > 5;
//反推回去

Action<string> A1 = s => Console.WriteLine(s);
A1("A1");
Action<string> A2 = (string s)=> Console.WriteLine(s);
A2("A2");
Action<string> A3 = (string s) => { Console.WriteLine(s); };
A3("A3");
Action<string> A4 = delegate(string s){ Console.WriteLine(s); };
A4("A4");

Func<int, bool> F1 = i => i > 5;
Console.WriteLine(F1(1)); 
Func<int, bool> F2 = (int i) => i > 5;
Console.WriteLine(F2(2));
Func<int, bool> F3 = (int i) => {return i > 5; };
Console.WriteLine(F3(3));
Func<int, bool> F4 = delegate(int i) { return i > 5; };
Console.WriteLine(F4(4));

image.png