目录
一、概述
"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。
二、Lambda的发展史
比如有这样一个场景,在给出的List集合中找出数字大于等于18的数字,假如我们不知道有 Linq 这种东西!
常规写法:
using System;
using System.Collections.Generic;
namespace LambadTest
{
internal class Program
{
static List<int> AgeList = new List<int> { 16, 17, 18, 19, 20 };
static void Main(string[] args)
{
List<int> list = OutPutAge();
Console.WriteLine(string.Join(",", list));
Console.ReadKey();
}
static List<int> OutPutAge()
{
List<int> list = new List<int>();
foreach (int item in AgeList)
{
if (item > 18)
{
list.Add(item);
}
}
return list;
}
}
}
输出:
这样写虽然能获取正确的值,但单独为它创建一个方法感觉有些浪费,问题是又必须用到这个方法,有时候还思考半天该给这个方法取什么名字,这时候 Lambda 就派上用场了!Lambda 最早是由委托转化而来,下面来介绍一下Lambda 的发展史,首先来看看委托的一些基本用法:
using System;
namespace LambadTest
{
internal class Program
{
public delegate void SayHi(string msg);
static void Main(string[] args)
{
SayHi sayHi = delegate(string msg)
{
Console.WriteLine(msg);
};
sayHi("你好!");
Console.ReadKey();
}
}
}
运行:
上面的代码,其实转换一下,就是下面的写法
using System;
namespace LambadTest
{
internal class Program
{
public delegate void SayHi(string msg);
static void Main(string[] args)
{
SayHi sayHi = SayHello;
sayHi("你好!");
Console.ReadKey();
}
static void SayHello(string message)
{
Console.WriteLine(message);
}
}
}
委托虽然可以不用单独创建一个方法就能随时使用,但是这样写还是有些不方便,给委托赋值还要加个 delegate ,总觉得写法有点别扭,有人可能会问,能不能去掉 delegate 呢? 下面就介绍如何去掉 deleagte:
using System;
namespace LambadTest
{
internal class Program
{
public delegate void SayHi(string msg);
static void Main(string[] args)
{
SayHi sayHi = (string msg) =>
{
Console.WriteLine(msg);
};
sayHi("你好!");
Console.ReadKey();
}
}
}
在上面代码中,括号中的 string 可以不写,效果一样的,如下
using System;
namespace LambadTest
{
internal class Program
{
public delegate void SayHi(string msg);
static void Main(string[] args)
{
SayHi sayHi = (msg) =>
{
Console.WriteLine(msg);
};
sayHi("你好!");
Console.ReadKey();
}
}
}
如果方法内的代码只有一行,甚至连 { } 都不用写,直接用下面的写法就可以了
using System;
namespace LambadTest
{
internal class Program
{
public delegate void SayHi(string msg);
static void Main(string[] args)
{
SayHi sayHi = (msg) => Console.WriteLine(msg);
sayHi("你好!");
Console.ReadKey();
}
}
}
上面的例子介绍了那么多,依然不是特别方便,因为我们还定义了委托,委托在定义的时候,已经固定好了参数的类型,如果我要用其他的类型参数,又要重新去定义一个委托了,那么又没有更好的方法呢,下面就介绍下 Action
using System;
namespace LambadTest
{
internal class Program
{
static void Main(string[] args)
{
Action<string, string> sayHi = (name, message) =>
{
Console.WriteLine("{0}说{1}", name, message);
};
sayHi("张三", "你好");
Console.ReadKey();
}
}
}
运行:
三、Action的用法
Action 是委托的一种,主要特征是无返回值,在 C# 开发中,常用来作为回调函数来使用。
例一:
using System;
namespace 委托的用法
{
internal class Program
{
static void Main(string[] args)
{
Action<int> callback = (res) => Console.WriteLine("结果:" + res);
GetResult(3, 4, callback);
Console.ReadKey();
}
static void GetResult(int x,int y, Action<int> callback)
{
int result = x + y;
callback(result);
}
}
}
运行:
例二:
using System;
namespace 委托的用法
{
internal class Program
{
static void Main(string[] args)
{
Test test = new Test();
test.CallBack = ReceiveCallback;
test.SayHi();
Console.ReadKey();
}
static void ReceiveCallback(int res)
{
Console.WriteLine("结果:" + res);
}
}
public class Test
{
public Action<int> CallBack;
public void SayHi()
{
Console.WriteLine("hey man!");
if (CallBack != null)
CallBack(1);
}
}
}
运行:
四、Func的用法
在上节中使用 Action 时,可以看到,Action 所指向的函数体都是 void 类型,但假设我们需要返回值怎么办呢,Func 就可以帮你解决这个问题。
在 Func 中,最后一个参数是返回值的类型,如下:
using System;
namespace 委托的用法
{
internal class Program
{
static void Main(string[] args)
{
Func<string, string, bool> checkName = (lastName, name) =>
{
if(lastName == "王" && name == "老")
return true;
else
return false;
};
bool result = checkName("王", "老");
Console.WriteLine("结果:{0}", result);
Console.ReadKey();
}
}
}
运行:
结束
如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言
end