委托 | 匿名方法 | 朗姆达表达式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _匿名方法与委托与朗姆达表达式
{
//匿名方法不能直接在类中定义,而是给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,定义一个匿名方法传递给委托
//匿名方法的定义很简单 就是使用delegate关键字
//接下来说说匿名方法的写法规则,先上例子: delegate(int i) { return i > 0; }
//匿名方法遵循这样的格式书写: delegate(形参表){方法体代码}
public delegate void MyDelegate1(); //定义一个委托
public delegate void MyDelegate2(string name); //定义一个委托
public delegate string MyDelegate3(string name); //定义一个委托
public delegate int Mydelegate4(params int[] arr); //定义一个委托
class Program
{
static void Main(string[] args)
{
//给一个无参数,无返回值的匿名方法赋给委托对象md1
MyDelegate1 md1 = delegate() { Console.WriteLine("小鸟说!早早早"); };
md1(); //执行委托输出:小鸟说!早早早
//给一个有参数,无返回值的匿名方法赋给委托对象md2
MyDelegate2 md2 = delegate(string name) { Console.WriteLine("大家好,我叫{0}", name); };
md2("姚明");//执行委托输出:大家好,我叫姚明
//给一个有参数,有返回值的匿名方法赋给委托对象md3
MyDelegate3 md3 = delegate(string name) { return "大家好,我叫" + name; };
Console.WriteLine(md3("马英九")); //执行委托输出:大家好,我叫马英九
//--------------------------下面我们使用朗姆达表达式来实现,我们发现朗姆达表达式比匿名方法更加简便。------------------------------
//对于没有参数,没有返回值的匿名方法,朗姆达表达式的写法如下:
//1.如果没有参数,MyDelegate1 md4 = 后面 只要写一个空的小括号就可以(朗姆达表达式比起匿名方法来省略了匿名方法的声明关键字delegate。如果没有参数直接写一个小括号就行了)然后用=>来区分方法体【告诉编译器,方法体在那边呢!】,方法体用{}大括号括起来,里面写方法体就可以了
//2.朗姆达表达式的参数无需声明数据类型,因为你在定义委托的时候就已经限定了这个委托只能接收什么样的数据类型。
MyDelegate1 md4 = () => { Console.WriteLine("你好,我是lambda表达式"); };
md4(); //执行委托输出:你好,我是lambda表达式
//带一个参数,没有返回值的匿名方法,朗姆达表达式的写法如下:
MyDelegate2 md5 = (name) => { Console.WriteLine("你好,我是{0}", name); };
md5("lambda表达式");//执行委托输出:你好,我是lambda表达式
//MyDelegate2 md5 = name => { Console.WriteLine("..."); };//如果只有一个参数,两小括号都可以省略
//带一个参数,有返回值的匿名方法,朗姆达表达式的写法如下:
MyDelegate3 md6 = (name) => { return "你好,我是" + name; };
Console.WriteLine(md6("lambda表达式"));//执行委托输出:你好,我是lambda表达式
//带一个可变参数,有返回值的匿名方法,朗姆达表达式的写法如下:
int sum = 0;
Mydelegate4 md7 = (myArr) =>
{
for (int i = 0; i < myArr.Length; i++)
{
sum += myArr[i];
};
return sum;
};
Console.WriteLine(md7(1, 2, 3, 4, 5, 6)); //输出:21
//或者使用如下方法
Mydelegate4 md8 = (MyArr) =>
{
return MyArr.Sum(); //Sum()是一个朗姆达自带的扩展方法,用于计算 System.Int32 值序列之和。
};
Console.WriteLine(md8(1, 2, 3, 4, 5, 6)); //输出:21
List<int> list = new List<int>() { 12, 4, 19, 1, 2, 3, 5, 7, 8, 69, 10 };
var query0 = list.OrderBy(x => x); //升序排序
var query1 = list.OrderByDescending(x => x).First(); //对list中的元素按照降序排列,然后取第一个,就可以获取list中最大的值 输出:69
var query2 = list.Sum(); //对list中各项求和 ;输出:140
Console.ReadKey();
}
}
}