自C#3.0开始,就可以使用一种新语法把实现代码赋予委托:lambda表达式。只要有委托参数类型的部分,就可以使用Lambda表达式。
下面先来看几个例子
static void Main(string[] args)
{
Action<int> a1 = delegate (int n) { n = n + 1; };//最原始的写法
Action<int> a2 = (int n)=>{ n = n + 1; };//进行第一步改造,可以删除delegate 然后在int n后面使用=>,读作goes to
Action<int> a3 = (n) => { n = n + 1; };//进行第二步改造,可以删除类型,因为类型可以由前面推断出来
Action<int> a4 = n => { n = n + 1; };//进行第二步改造,由于只有一个参数,所以连括号也可以删除,这就是这个匿名委托最简单的方式
//第二个例子
Func<int,string,int> f1 = delegate (int n,string s) { return n; };//这是最原始的写法
Func<int,string,int> f2 = (int n,string s)=>{ return n; };//进行第一步改造,删除delegate,加入=>符号
Func<int,string,int> f3 = ( n, s)=>{ return n; };//删除类型
//Func<int,string,int> f4 = n, s=>{ return n; };//由于有多个参数,所以不能删除括号,否则会报错
Func<int,string,int> f4 = ( n, s)=> n;//如果方法体只有一句代码且是返回值代码,那么可以省去return和{},这个就是最简的方式
}
使用反编译器查看到的代码
通过上面的例子演示了有返回值和无返回值,单个参数与多个参数的例子,我们来总结下lambda表达式的用法以及规则
1.可以省去delegate关键字
2.可以省去参数类型
3.如果只有一个参数,可以省去括号
4.如果方法有返回值,且方法只有一句代码,这句代码还是返回值代码,那么就可以省去return和{},直接写要返回的值就可以了
下面通过例子来练习下Lambda表达式
Func<int, string> f5 = delegate (int n) { return "你好" + n; };
Console.WriteLine(f5(4));
Console.ReadKey();
对上面例子进行简化代码
Func<int, string> f6 = (int n) => { return "你好" + n; };
Func<int, string> f7 = (n) => { return "你好" + n; };
Func<int, string> f8 = n => { return "你好" + n; };
Func<int, string> f9 = n => "你好" + n;
最终可以简化成f9这个样子
下面再来一个例子
Func<int, string> n1 = n => "你能反推回去吗???"+n;
Console.WriteLine(n1(1));
下面是推导过程
//第四个例子
Func<int, string> n1 = n => "你能反推回去吗???" + n;
Func<int, string> n2 = n => { return "你能反推回去吗???" + n; };
Func<int, string> n3 = (n) => { return "你能反推回去吗???" + n; };
Func<int, string> n4 = (int n) => { return "你能反推回去吗???" + n; };
Func<int, string> n5 = delegate(int n){ return "你能反推回去吗???" + n; };
Console.WriteLine(n1(1));
Console.ReadKey();
下面我们来改造下之前写的GetMax方法
delegate bool CompareNum(object obj1, object obj2);
class Program
{
static void Main(string[] args)
{
int[] nums = { 1, 2, 23, 321, 124, 24321, 214 };
//Func<object, object, bool> cpn = delegate (object obj1, object obj2)
//{
// int i1 = (int)obj1;
// int i2 = (int)obj2;
// return i1 > i2;
//};
//Func<int, int, bool> f1 = delegate (int n1, int n2) { return n1 > n2; };
//Func<int, int, bool> f1 = (int n1, int n2)=>{ return n1 > n2; };
//Func<int, int, bool> f1 = ( n1, n2)=>{ return n1 > n2; };
//Func<int, int, bool> f1 = (n1, n2) => n1 > n2;
//int max = (int)GetMax(nums, f1);
//Console.WriteLine(max);
//对Person的age进行比较
Person[] p1 = new Person[] { new Person() { Age = 12, Name = "张三" }, new Person() { Age = 22, Name = "历史" }, new Person() { Age = 23, Name = "王五" } };
Func<Person, Person, bool> f2 = (n1, n2) => n1.Age > n2.Age;
Person max = (Person)GetMax<Person>(p1, f2);
Console.WriteLine(max.ToString());
Console.ReadKey();
}
static T GetMax<T>(T[] obj, Func<T, T, bool> f1)
{
T max = obj[0];
for (int i = 1; i < obj.Length; i++)
{
if (!f1(max, obj[i]))
{
max = obj[i];
}
}
return max;
}
}
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
public override string ToString()
{
return "姓名是:" + Name + ",年龄是" + Age;
}
}
现在上面我们创建一个比较整型的委托,还有一个比较人的年龄的委托,这样写起来十分舒适,十分简单。只需要一句代码就能搞定了!!!
—本博客是学习以后记录知识,如有侵权,请联系删除!!!!
版权声明:本文为qq_33407246原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。