首先得明白linq到底是什么?
官方定义是将语言集成查询功能集成到C#的技术统称,针对不同的数据源
LINQ 系列技术提供了针对对象 (LINQ to Objects)、关系数据库 (LINQ to SQL) 和 XML (LINQ to XML) 的一致查询体验。
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/linq/
通俗地理解linq,就是不同的数据源封装的一系列方法,诸如Where,Select等等,
什么是lambda?相比较而言,lambda范围和linq窄不少?两者完全不是一个东西,lambda分为两种形式,一种是lambda表达式,
可变成委托,它几乎是为委托而生,但作用不仅仅如此,还可以变成表达式树,
两者联系:使用 lambda 表达式来指定参数值
关于这一点,在官方文档中有一点说的非常清楚
如果使用基于方法的语法在 System.Linq.Enumerable 类中(例如,在 LINQ to Objects 和 LINQ to XML 中)调用 Enumerable.Select 方法,则参数为委托类型 System.Func<T,TResult>。 如果在 System.Linq.Queryable 类中(例如,在 LINQ to SQL 中)调用 Queryable.Select 方法,则参数类型为表达式树类型 Expression<Func<TSource,TResult>>。 在这两种情况下,都可以使用相同的 lambda 表达式来指定参数值。 尽管通过 Lambda 创建的对象实际具有不同的类型,但其使得 2 个 Select 调用看起来类似。
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions
为了真正理解Linq,这里封装自己的Ling to Objects方法,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace YieldLinqDemo.Linq
{
public static class ExtenssionLinq
{
//筛选出来一个集合中满足条件的项,返回新的数组
//针对每种类型的集合,采用泛型方法
public static List<T> XuweiWhere<T>(this List<T> list,Func<T,bool> func1) {
List<T> resultlist = new List<T>();
foreach (T item in list)
{
if (func1.Invoke(item))
{
resultlist.Add(item);
}
}
return resultlist;
}
//我们封装的还是有问题,对比原装Linq,它是按需获取的,
//我们到底该怎么改动呢?,返回单项迭代对象,添加yield关键字,
public static IEnumerable<T> XuweiWhere2<T>(this IEnumerable<T> list, Func<T, bool> func1)
{
//IEnumerable<T> resultlist = new IEnumerable<T>();
foreach (T item in list)
{
if (func1.Invoke(item))
{
yield return item;
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using YieldLinqDemo.Linq;
namespace YieldLinqDemo
{
class Program
{
static void Main(string[] args)
{
List<int> intlist = InitData();
//var linqlist = intlist.Where(s=>s>=100);
var linqlist = intlist.Where(s => {
Thread.Sleep(300);
return s >= 100;
});
//***********linq判断一个返回一个,依次按需返回
foreach (var item in linqlist)
{
//Thread.Sleep(300);
Console.WriteLine(item);
}
//**********mylinq方法,阻塞一阵,全部判断完,全部返回
//将后面的lambda变成正常些模式,判断过程执行休眠
//var mylinqlist = intlist.XuweiWhere(s => s >= 100);
var mylinqlist = intlist.XuweiWhere2(s =>
{
Thread.Sleep(300);
return s >= 100;
});
foreach (var item in mylinqlist)
{
//Thread.Sleep(300);
Console.WriteLine(item);
}
//总结:Linq Where:基于委托的代码封装,把数据筛选的通用逻辑完成,把条件判断等变量条件封装成一个委托,
//其实还有很多方法,比如Select等等同样如此,封装通用逻辑,可变逻辑用委托封装,不过有些方法不需要
//不需要传递委托,比如比如求和,求平均等等,
//以上叫做Ling to object---Enumerable--数据源是内存里面的集合--传递委托
//其实还有Linq to sql--基于Queryable--数据源在SqlServer---从表达式目录树而来
var queryable = InitData().AsQueryable();
queryable.Where(s=>s>=100);
//提示无法将linq转为表达式目录树,
//queryable.Where(s =>
//{
// Thread.Sleep(300);
// return s >= 100;
//});
//开发过程中其实,有很多秘密需要大家去探究,而不是停留在表面
//深入下去,一方面自我提升,能更好引用,扩展,另一方面升华自己
//提升编程思想,人生境界
//nosql redis excel nmp cache传递条件,通过lambda传进来
//终极理想,Linq to everything--设计思想,把任何数据操作封装起来,屏蔽差异
}
static List<int> InitData() {
return new List<int>() { 1,23,23,378,32,12,123,3798,213,212,12,12,89,21,2,222,2787,232,2322};
}
}
}
封装自己的Linq中Where,实现和封装Linq中Where方法一样的功能,
//*************涉及知识点:
/*
第一:泛型方法,通用性更强,不同的集合通用
第二:封装委托,传项返回真假,封装多变的条件
第三:静态类,静态方法,传参数第一个添加this关键字,扩展方法、
第四:传入迭代器,返回迭代器,方法体内,返回Yield关键字,实现按需返回结果
*/
参考腾讯课堂,朝夕教育eleven老师视频课程