首先,Linq是由委托和lambda表达式演变而来的。
- 委托,委托是一种类型,指向具体方法的类型,调用委托变量是执行的就是委托指向的具体方法;
- .Net中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自定义的委托;
public delegate int AddDelegate(int a, int b);
class Program
{
static async Task Main(string[] args)
{
AddDelegate addDelegate = AddNumber;
int tatol = addDelegate(1, 3);
Console.WriteLine($"结果:{tatol}");
}
static private int AddNumber(int a, int b)
{
return a + b;
}
}
或者用Func泛型委托来代替,如下:
class Program
{
static async Task Main(string[] args)
{
Func<int,int,int> action = AddNumber;
int tatol = action(1, 3);
Console.WriteLine($"结果:{tatol}");
}
static private int AddNumber(int a, int b)
{
return a + b;
}
}
- 委托变量不只可以指向普通方法,还可以指向匿名方法,
static async Task Main(string[] args)
{
Func<int, int, int> funcAdd = delegate (int a, int b)
{
return a + b;
};
Console.WriteLine($"结果:{funcAdd(1,4)}");
}
或者使用Lambda表达式的方式,如下:
static async Task Main(string[] args)
{
Func<int, int, int> funcAdd = (int a, int b) => { return a + b; };
Console.WriteLine($"结果:{funcAdd(1, 2)}");
}
如果是只有一行代码的逻辑代码,连花括号也不需要 :
static async Task Main(string[] args)
{
Func<string,string> funcPrint = (string str) => str + "hahah";
Console.WriteLine($"结果:{ funcPrint("24234")}");
}
如果不需要入参,则小括号里面直接为空
static async Task Main(string[] args)
{
Func<string> funcPrint = () => "hahah";
Console.WriteLine($"结果:{ funcPrint()}");
}
-
Linq背后:linq背后的实现其实就是委托和lambda表达式,如下,我自定义了一个MyWhere的Linq表达式,与Linq的Where进行对比:
1.微软自带的Linq的Where条件语句
static void Main(string[] args)
{
int[] numbers = new int[] { 1,2,8,12,3,56,78};
IEnumerable<int> items = numbers.Where(i => i > 5);
foreach (var num in items)
{
Console.WriteLine(num);
}
}
- 或者,我们可以自定义一个MyWhere表达式,传递一个数组和一个Func的委托,如下:
static void Main(string[] args)
{
int[] numbers = new int[] { 1,2,8,12,3,56,78};
//定义一个Func泛型的lambda表达式
Func<int, bool> fun = (a) => a > 5;
foreach (var item in MyWhere(numbers, fun))
{
Console.WriteLine(item);
}
}
//自定义的过滤方法
static IEnumerable<int> MyWhere(int[] item, Func<int, bool> func)
{
List<int> result = new List<int>();
foreach (var data in item)
{
if(func(data))
{
result.Add(data);
}
}
return result;
}
- 注意,这里我们在返回结果的时候,是先把所有满足条件的数据放到了一个List<int>