Lambda表达式是什么?
Lambda 表达式是一种可用于创建 委托或 表达式目录 类型的 匿名函数 (我的理解是:一个被简化的匿名函数)
那什么是匿名函数呢?
匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用。 可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数。
话不多说 上图上代码
1.使用匿名函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Studying
{
public class StudyLambda
{
public delegate void weituo(); //定义一个无参有返回值的委托
public delegate string weituo1(); //无参有返回值
public delegate void weituo2(string name, int x,int y);//有参无返回值
//使用委托
public static void sayhi()
{
weituo2 wt = new weituo2(show);
wt("嬷嬷",18,36);
}
private static void show(string name,int x, int y)
{
Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x,y);
}
//使用匿名函数代替
public static void incognito()
{
weituo2 wt =
delegate (string name, int x, int y)
{
Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x, y);
};
wt("嬷嬷", 18, 36);
}
}
}
输出
由以上代码可以看出 使用匿名函数 代替委托实例化以及调用 得出的结果是一致的
2.lambda表达式
前面已经提到过 lambda表达式就是简化的匿名函数 接下来看它是如何一步步简化的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Studying
{
public class StudyLambda
{
public delegate void weituo(); //定义一个无参有返回值的委托
public delegate string weituo1(); //无参有返回值
public delegate void weituo2(string name, int x,int y);//有参无返回值
//使用委托
public static void sayhi()
{
weituo2 wt = new weituo2(show);
wt("嬷嬷",18,36);
}
private static void show(string name,int x, int y)
{
Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x,y);
}
//使用匿名函数代替
public static void incognito()
{
weituo2 wt =
delegate (string name, int x, int y)
{
Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x, y);
};
wt("嬷嬷", 18, 36);
}
// lambda表达式 有参无返回值
/// <summary>
/// 1.delegate换成=> 剪头左边是参数列表
/// 2.去掉参数类型(因为委托调用方法必须要满足约束:即1.参数类型个数一致2.是否有返回值 所以在约束范围内可以不用写参数类型)
/// 3.去掉{}(可以看到在无返回值里面 当方法体只有一行时{}可以省略)
/// </summary>
public static void lam()
{
weituo2 wt = (name,x,y)=>Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x, y);
wt("嬷嬷", 18, 36);
}
//由于这里是不带返回值的 C#里面有定义好的方法可以直接使用
Action act = () => { }; //无参无返回值
Action<string> act1 = s => { Console.WriteLine(""); }; //有参有返回值
Action<string, int, DateTime> act2 = (a, b, c) => { Console.WriteLine(""); };
}
}
系统有定义好的无返回值的匿名函数 Action<> 可以给我们直接使用 因为是泛型 所以参数类型也没有限制 上面的例子都是针对有返回值类型的 接下来再来看一下无返回值类型的演变
//使用匿名函数代替 有返回值
public static void isret()
{
weituo3 wt =
delegate (int x, int y)
{
return x + y;
};
wt(3,4);
}
// lambda表达式 无返回值
/// <summary>
/// 1.delegate换成=> 剪头左边是参数列表 参数只有一个时可以省略()
/// 2.去掉参数类型(因为委托调用方法必须要满足约束:即1.参数类型个数一致2.是否有返回值 所以在约束范围内可以不用写参数类型)
/// 3.去掉{}(可以看到在有返回值里面 当方法体只有一行时{}和return都可以省略)
/// </summary>
public static void isret1()
{
weituo3 wt = ( x, y)=> x + y;
wt(3, 4);
}
Func<int> ac = () => 0;//无参有返回值
同样 C#也有自带的有返回值的匿名函数Func<> 不需要我们一个个去定义
接下来看一个实例 :输出大于7的一百以内的数
public static void linq() {
List<int> list = new List<int>();
for (int i = 0; i < 100; i++)
{
list.Add(i);
}
foreach (int i in list.Where<int>(num=>num>7))
{
Console.WriteLine(i);
}
}
结束