C# 深刻理解Ling本质,及linq和lambda区别,自己封装ling

首先得明白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老师视频课程

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值