首先得明白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
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 XuweiWhere(this List list,Func func1) {
List resultlist = new List();
foreach (T item in list)
{
if (func1.Invoke(item))
{
resultlist.Add(item);
}
}
return resultlist;
}
//我们封装的还是有问题,对比原装Linq,它是按需获取的,
//我们到底该怎么改动呢?,返回单项迭代对象,添加yield关键字,
public static IEnumerable XuweiWhere2(this IEnumerable list, Func func1)
{
//IEnumerable resultlist = new IEnumerable();
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 intlist = InitData();
//var linqlist = intlist.Where(s=>s>=100);
var linqlist = intlist.Where(s => {
Thread.Sleep(300);
return s >= 100;
});
/
参考腾讯课堂,朝夕教育eleven老师视频课程



