栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

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

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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。 如果在 System.Linq.Queryable 类中(例如,在 LINQ to SQL 中)调用 Queryable.Select 方法,则参数类型为表达式树类型 Expression>。 在这两种情况下,都可以使用相同的 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 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老师视频课程

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923141.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号