佛山网站建设与设计公司如何查询网站域名备案信息

张小明 2026/3/12 21:12:18
佛山网站建设与设计公司,如何查询网站域名备案信息,免费商城软件,ppt模板免费下载 素材百度网盘一、先搞懂#xff1a;什么是 LINQ#xff1f;#xff08;通俗 技术定义#xff09; 通俗比喻 LINQ 就像 “通用遥控器”#xff1a; 不同的 “家电” 不同的数据源#xff08;内存集合、数据库、XML、Excel 等#xff09;#xff1b;不同家电原本有各自的 “操作方…一、先搞懂什么是 LINQ通俗 技术定义通俗比喻LINQ 就像 “通用遥控器”不同的 “家电” 不同的数据源内存集合、数据库、XML、Excel 等不同家电原本有各自的 “操作方式”遍历集合写循环、查数据库写 SQL、解析 XML 写专用代码LINQ 这个 “通用遥控器” 统一的语法不管操作哪种数据源都用相似的写法比如筛选数据都用 Where转换数据都用 Select。技术定义LINQLanguage Integrated Query语言集成查询是 C# 内置的查询框架核心价值是统一语法用一套语法操作所有数据源集合、数据库、XML 等类型安全编译期检查查询语法错误不像 SQL 写错要运行时才发现简洁高效用几行代码替代冗余的循环 / 判断底层就是扩展方法 Lambda的组合查询语法只是语法糖。LINQ 的两种常用写法新手先掌握方法语法LINQ 有两种写法最终都会编译成 “扩展方法 Lambda”我们以订单筛选为例对比usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;// LINQ核心命名空间// 基础订单实体publicclassOrder{publicintOrderId{get;set;}publicdecimalAmount{get;set;}publicstringCustomer{get;set;}}classProgram{staticvoidMain(){// 模拟数据源订单列表ListOrderordersnewListOrder{newOrder{OrderId1,Amount800,Customer张三},newOrder{OrderId2,Amount1200,Customer李四},newOrder{OrderId3,Amount1500,Customer王五}};// 写法1查询语法SQL风格语法糖varquerySyntaxfromoinorderswhereo.Amount1000selectnew{o.OrderId,o.Customer,金额o.Amount};// 写法2方法语法扩展方法LambdaLINQ底层实现varmethodSyntaxorders.Where(oo.Amount1000)// 扩展方法Lambda筛选.Select(onew{o.OrderId,o.Customer,金额o.Amount});// 扩展方法Lambda转换// 两种写法结果完全一致Console.WriteLine(查询语法结果);foreach(variteminquerySyntax)Console.WriteLine($订单ID{item.OrderId}客户{item.Customer});Console.WriteLine(\n方法语法结果);foreach(variteminmethodSyntax)Console.WriteLine($订单ID{item.OrderId}客户{item.Customer});}}输出查询语法结果 订单ID2客户李四 订单ID3客户王五 方法语法结果 订单ID2客户李四 订单ID3客户王五核心解析给新手的话查询语法from...where...select是 SQL 风格的 “语法糖”编译器会自动转换成方法语法扩展方法 Lambda方法语法是 LINQ 的底层实现形式也是新手需要重点掌握的更灵活、更贴近底层LINQ 的核心就是给集合或其他数据源扩展一系列通用方法Where/Select 等每个方法接收 Lambda 作为 “查询规则”实现数据的筛选 / 转换 / 查找。二、手搓核心 LINQ 方法扩展方法 Lambda背景事件新手的痛点 —— 重复写循环太冗余你处理订单数据时需要频繁做 3 件事筛选符合条件的订单比如金额 1000转换订单数据格式比如只保留 ID 和客户名查找第一个符合条件的订单比如找李四的订单每次都写foreach循环会非常冗余我们用扩展方法 Lambda手动实现这 3 个核心 LINQ 方法理解 LINQ 的底层逻辑。步骤 1定义基础实体和数据源usingSystem;usingSystem.Collections.Generic;// 订单实体新手能理解的简单类publicclassOrder{publicintOrderId{get;set;}publicdecimalAmount{get;set;}publicstringCustomer{get;set;}}// 存放自定义LINQ扩展方法的静态类必须静态publicstaticclassMyLinqExtensions{// 后续手动实现Where/Select/FirstOrDefault方法}classProgram{staticvoidMain(){// 模拟订单数据源ListOrderordersnewListOrder{newOrder{OrderId1,Amount800,Customer张三},newOrder{OrderId2,Amount1200,Customer李四},newOrder{OrderId3,Amount1500,Customer王五}};// 后续调用自定义LINQ方法}}步骤 2手动实现 Where 方法筛选数据这里我将带着大家从1.0版本手搓Where方法直到最终版本但是后面的Select和FirstOrDefault就不带着大家从零手搓了希望大家慢慢阅读。1.0 版本(不能灵活选择筛选逻辑不能选择传入的参数类型)核心MyWhere方法传入一个ListOrder集合获得一个ListOrder集合方法在函数内部实现// 1.0版本publicstaticListOrderMyWhere(ListOrderlist){ListOrdernewListnewListOrder();foreach(varorderinlist){if(order.Amount1000){newList.Add(order);}}returnnewList;}完整代码与结果usingSystem;usingSystem.Collections.Generic;// 订单实体新手能理解的简单类publicclassOrder{publicintOrderId{get;set;}publicdecimalAmount{get;set;}publicstringCustomer{get;set;}}// 存放自定义LINQ扩展方法的静态类必须静态publicstaticclassMyLinqExtensions{// 1.0版本publicstaticListOrderMyWhere(ListOrderlist){ListOrdernewListnewListOrder();foreach(varorderinlist){if(order.Amount1000){newList.Add(order);}}returnnewList;}}classProgram{staticvoidMain(){// 模拟订单数据源ListOrderordersnewListOrder{newOrder{OrderId1,Amount800,Customer张三},newOrder{OrderId2,Amount1200,Customer李四},newOrder{OrderId3,Amount1500,Customer王五}};varmyNewListMyLinqExtensions.MyWhere(orders);Console.WriteLine(筛选大于1000的用户);foreach(varorderinmyNewList){Console.WriteLine(${order.Customer}的资产是{order.Amount});}}}运行结果筛选大于1000的用户 李四的资产是1200王五的资产是1500槽点虽然我们实现了筛选出资产大于1000用户的功能了但是这个筛选逻辑是写在方法MyWhere内部的如果选择不想筛选存款大于1000的ListOrder而是想筛选出用户Id大于2的集合ListOrder那么我们需要进入MyWhere函数内部修改代码非常的麻烦复用率很低。// 将筛选逻辑是存款大于1000改成id大于2// if (order.Amount 1000)if(order.OrderId2){newList.Add(order);}你看每次我们想要修改筛选逻辑都要进去代码内部做出相应的修改非常麻烦。那我们再聚焦到这个筛选逻辑上。这个筛选逻辑其实就是实现了这样的功能如果order对象的某些属性符合某些特征就执行下面的添加操作比如某个order的存款大于1000为真就将这个order添加到新的list集合中某个order的id大于2为真就将这个order添加到新的list集合中那么我们能不能把某个order的某个属性为真这个逻辑封装成一个方法呢比如我传递进去一个order它自动帮我判断存款是不是大于1000然后返回一个bool值为真的话我就将这个order添加到新的集合中。比如我们可以在外部定义这样的一个函数publicstaticboolIsOver1000(Orderorder){returnorder.Amount1000;}那么如何接收这个方法并且在我们的MyWhere函数中调用呢没错使用委托2.0 版本(可以灵活传递筛选逻辑不能选择传入的参数类型)我们每次要修改筛选逻辑都要进去代码内部那能不能将筛选逻辑放在外面通过参数传进来呢巧了委托不就是可以将函数变成参数传递的一种方法吗于是我们将筛选逻辑变成一个参数这个参数类型是FuncOrder,bool的委托这个委托接收的是方法一个参数为Order返回bool的方法这不就是我们上面定义的IsOver1000方法吗// 2.0版本publicstaticclassMyLinqExtensions{publicstaticListOrderMyWhere(ListOrderlist,FuncOrder,boolfunc){ListOrdernewListnewListOrder();foreach(varorderinlist){if(func(order)){newList.Add(order);}}returnnewList;}}完整代码与调用结果usingSystem;usingSystem.Collections.Generic;// 订单实体新手能理解的简单类publicclassOrder{publicintOrderId{get;set;}publicdecimalAmount{get;set;}publicstringCustomer{get;set;}}// 存放自定义LINQ扩展方法的静态类必须静态publicstaticclassMyLinqExtensions{// 2.0版本publicstaticListOrderMyWhere(ListOrderlist,FuncOrder,boolfunc){ListOrdernewListnewListOrder();foreach(varorderinlist){if(func(order)){newList.Add(order);}}returnnewList;}}classProgram{staticvoidMain(){// 模拟订单数据源ListOrderordersnewListOrder{newOrder{OrderId1,Amount800,Customer张三},newOrder{OrderId2,Amount1200,Customer李四},newOrder{OrderId3,Amount1500,Customer王五}};// 获取筛选后的订单列表varmyNewListMyLinqExtensions.MyWhere(orders,IsOver1000);Console.WriteLine(筛选大于1000的用户);foreach(varorderinmyNewList){Console.WriteLine(${order.Customer}的资产是{order.Amount});}}// 筛选条件函数传入一个订单若订单资产大于1000则返回true内部方法就会将这个订单加入到新列表staticpublicboolIsOver1000(Orderorder){returnorder.Amount1000;}}输出筛选大于1000的用户 李四的资产是1200 王五的资产是1500优点我们将筛选逻辑放到外面了如果想要换一个筛选条件比如要将id大于2的筛选出来那就只需要传递不同的方法给MyWhere方法就行了降低了耦合度。注意我们这里是用委托接收方法外部定义的是方法但是参数是一个委托类型也就是将外部的方法放进这个委托参数里。缺点如果我们筛选的不是Order集合而是一个Student集合那这个方法就失效了我们需要再创建一个Student集合的MyWhere方法是不是非常麻烦能不能优化这样让一个MyWhere方法接收不同类型的功能是不是想到了泛型3.0 版本(可以灵活传递筛选逻辑可以选择传入的参数类型)3.0版本我们定义了一个新的Student类并且用泛型优化了MyWhere方法publicclassStudent{publicintStudentId{get;set;}publicstringStudentName{get;set;}publicintStudentAge{get;set;}}// 3.0版本publicstaticclassMyLinqExtensions{publicstaticListTMyWhereT(ListTlist,FuncT,boolfunc){ListTnewListnewListT();foreach(varorderinlist){if(func(order)){newList.Add(order);}}returnnewList;}}加了泛型后我们就可以随意的再各种类型的集合上使用MyWhere方法了:完整代码与运行结果usingSystem;usingSystem.Collections.Generic;// 订单实体新手能理解的简单类publicclassOrder{publicintOrderId{get;set;}publicdecimalAmount{get;set;}publicstringCustomer{get;set;}}// 学生类publicclassStudent{publicintStudentId{get;set;}publicstringStudentName{get;set;}publicintStudentAge{get;set;}}// 存放自定义LINQ扩展方法的静态类必须静态publicstaticclassMyLinqExtensions{// 3.0版本加了泛型publicstaticListTMyWhereT(ListTlist,FuncT,boolfunc){ListTnewListnewListT();foreach(varorderinlist){if(func(order)){newList.Add(order);}}returnnewList;}}classProgram{staticvoidMain(){// 模拟订单数据源ListOrderordersnewListOrder{newOrder{OrderId1,Amount800,Customer张三},newOrder{OrderId2,Amount1200,Customer李四},newOrder{OrderId3,Amount1500,Customer王五}};ListStudentstudentsnewListStudent(){newStudent(){StudentId1,StudentAge10,StudentName小明},newStudent(){StudentId2,StudentAge11,StudentName小红},newStudent(){StudentId3,StudentAge12,StudentName小文}};// 获取筛选后的订单列表varmyNewListMyLinqExtensions.MyWhere(orders,IsOver1000);Console.WriteLine(筛选大于1000的订单的用户);foreach(varorderinmyNewList){Console.WriteLine(${order.Customer}的资产是{order.Amount});}// 获取筛选后的学生列表varmyNewStudentListMyLinqExtensions.MyWhereStudent(students,IsOver10);Console.WriteLine(筛选年龄大于10岁的学生);foreach(varstudentinmyNewStudentList){Console.WriteLine($学生名{student.StudentName},学生年龄{student.StudentAge});}}// 筛选条件函数传入一个订单若订单资产大于1000则返回true内部方法就会将这个订单加入到新列表staticpublicboolIsOver1000(Orderorder){returnorder.Amount1000;}// 筛选条件函数传入一个学生若学生年龄大于10则返回true内部方法就会将这个学生加入到新列表staticpublicboolIsOver10(Studentstudent){returnstudent.StudentAge10;}}运行结果筛选大于1000的订单的用户 李四的资产是1200王五的资产是1500筛选年龄大于10岁的学生 学生名小红,学生年龄11学生名小文,学生年龄12细心的同学发现了一个问题明明我们定义的MyWhere是泛型方法按道理来说用MyLinqExtensions.MyWhereStudent(students,IsOver10);这样的带尖括号的调用才是正确的为什么MyLinqExtensions.MyWhere(orders,IsOver1000);这样不用尖括号调用也行呢原因的MyWhere方法传递的第一个参数是ListT类型的集合只要传递了一个类型集合的参数MyWhere方法就知道了参数类型是什么举个例子我们传递了一个订单列表ListOrder类型的orders那么MyWhere方法就知道了它的参数类型是Order即MyWhereOrder这个后面的尖括号可以省略因为参数部分已经明确给出了参数T的类型。所以MyLinqExtensions.MyWhere(orders,IsOver1000);可以正常调用。可改进点利用拓展方法将MyLinqExtensions.MyWhere(orders,IsOver1000);这个式子简化利用Lambda表达式将要传递的筛选方法IsOver1000等简化不知道这两个知识点的同学可以看我上一篇文章.NET进阶——深入理解Lambda表达式1Lambda入门4.0 版本(利用拓展方法和Lambda表达式简化代码)还记得拓展方法的要点吗静态类静态方法this关键字我们来改造以下MyWhere方法publicstaticclassMyLinqExtensions{// 4.0版本因为本来就是静态类静态方法所以这里只需要加一个this关键字publicstaticListTMyWhereT(thisListTlist,FuncT,boolfunc){ListTnewListnewListT();foreach(varorderinlist){if(func(order)){newList.Add(order);}}returnnewList;}}改造完成后就可以这样调用了varmyNewListorders.MyWhere(IsOver1000);varmyNewStudentListstudents.MyWhere(IsOver10);然后我们进一步改造还记得Lambda表达式吗本质就是一个匿名函数对不对那么我们将IsOver1000和IsOver10改造一下让他不要传递函数名直接将匿名函数传递进去varmyNewListorders.MyWhere(pp.Amount1000);varmyNewStudentListstudents.MyWhere(qq.StudentAge10);为什么这里可以用pq呢pq是啥由于我们的MyWhere方法接收的第二个参数是一个委托他接受一个泛型方法由于我们前面已经通过第一个参数知道了类型T是什么假如这里类型T是Student那么这里要接收的方法就是接收一个Student类型的实例p如果p的年龄大于10岁就返回真。完整代码和输出结果usingSystem;usingSystem.Collections.Generic;// 订单实体新手能理解的简单类publicclassOrder{publicintOrderId{get;set;}publicdecimalAmount{get;set;}publicstringCustomer{get;set;}}publicclassStudent{publicintStudentId{get;set;}publicstringStudentName{get;set;}publicintStudentAge{get;set;}}// 存放自定义LINQ扩展方法的静态类必须静态publicstaticclassMyLinqExtensions{// 4.0版本:加入拓展方法publicstaticListTMyWhereT(thisListTlist,FuncT,boolfunc){ListTnewListnewListT();foreach(varorderinlist){if(func(order)){newList.Add(order);}}returnnewList;}}classProgram{staticvoidMain(){// 模拟订单数据源ListOrderordersnewListOrder{newOrder{OrderId1,Amount800,Customer张三},newOrder{OrderId2,Amount1200,Customer李四},newOrder{OrderId3,Amount1500,Customer王五}};ListStudentstudentsnewListStudent(){newStudent(){StudentId1,StudentAge10,StudentName小明},newStudent(){StudentId2,StudentAge11,StudentName小红},newStudent(){StudentId3,StudentAge12,StudentName小文}};varmyNewListorders.MyWhere(pp.Amount1000);varmyNewStudentListstudents.MyWhere(qq.StudentAge10);Console.WriteLine(筛选大于1000的订单的用户);foreach(varorderinmyNewList){Console.WriteLine(${order.Customer}的资产是{order.Amount});}Console.WriteLine(筛选年龄大于10岁的学生);foreach(varstudentinmyNewStudentList){Console.WriteLine($学生名{student.StudentName},学生年龄{student.StudentAge});}}}输出结果筛选大于1000的订单的用户 李四的资产是1200王五的资产是1500筛选年龄大于10岁的学生 学生名小红,学生年龄11学生名小文,学生年龄125.0 版本(最终版)没想到吧还可以优化现在还是有两个问题现在只能用在List集合上因为定义的是ListT如果要用在数组Array或者哈希集合HashSetT上就没办法了。函数内部的foreach循环结束再返回如果集合数量很大会在MyWhere方法内部循环很久体验非常不好。改造后publicstaticclassMyLinqExtensions{// 扩展IEnumerableT而非ListTpublicstaticIEnumerableTMyWhereT(thisIEnumerableTsource,FuncT,boolfunc){// 不再提前new ListT而是用yield return实现“延迟执行”foreach(variteminsource){if(func(item)){// 每次遍历才返回一个元素而非一次性创建整个集合yieldreturnitem;}}}好处 1通用性拉满 —— 适配所有可遍历集合最直观的好处你的ListT版本的MyWhere有个致命限制只能给 List 用如果想筛选数组、HashSet就会编译报错而IEnumerableT版本能适配所有实现该接口的集合。好处 2支持延迟执行懒加载—— 大幅提升性能 / 节省内存这是IEnumerableT最核心的优势也是 LINQ 的 “灵魂特性”你的ListT版本调用MyWhere时会立即遍历原集合创建新的ListT并填充所有符合条件的元素立即执行IEnumerableT版本调用MyWhere时不会执行任何遍历 / 筛选逻辑直到你用foreach遍历结果、调用ToList()/ToArray()时才会逐个遍历元素并筛选延迟执行好处 3符合 “面向抽象编程”—— 代码更灵活、易扩展软件开发的核心原则之一是 “依赖抽象而非具体实现”ListT是 “具体实现”比如它有 Add、Remove、Sort 等特有方法IEnumerableT是 “抽象接口”只定义了 “能遍历” 这一个核心能力。好处 4支持链式调用的流式处理IEnumerableT的延迟执行特性让 LINQ 的链式调用.Where().Select().OrderBy()变成 “流式处理”每个步骤都不创建中间集合而是在遍历最终结果时一次性完成所有步骤比如先筛选、再转换、再排序只遍历一次集合而你的ListT版本每调用一次MyWhere就创建一个新 List链式调用会产生多个中间集合比如.MyWhere().MySelect()会创建 2 个 List内存开销大。核心解析MyWhere是扩展方法this ListT source表示给所有ListT扩展这个方法泛型适配任意集合FuncT, bool predicate是 Lambda 的 “容器”o o.Amount 1000就是传入的筛选规则底层逻辑就是 foreach 循环调用 Lambda 判断每个元素是否符合规则符合就加入结果列表 —— 这就是原生 LINQ Where 的核心逻辑。5.0版本最终版本代码与结果usingSystem;usingSystem.Collections.Generic;// 订单实体新手能理解的简单类publicclassOrder{publicintOrderId{get;set;}publicdecimalAmount{get;set;}publicstringCustomer{get;set;}}publicclassStudent{publicintStudentId{get;set;}publicstringStudentName{get;set;}publicintStudentAge{get;set;}}// 存放自定义LINQ扩展方法的静态类必须静态publicstaticclassMyLinqExtensions{// 5.0版本publicstaticIEnumerableTMyWhereT(thisIEnumerableTlist,FuncT,boolfunc){if(sourcenull)thrownewArgumentNullException(nameof(source));if(selectornull)thrownewArgumentNullException(nameof(selector));foreach(varorderinlist){if(func(order)){yieldreturnorder;}}}}classProgram{staticvoidMain(){// 模拟订单数据源ListOrderordersnewListOrder{newOrder{OrderId1,Amount800,Customer张三},newOrder{OrderId2,Amount1200,Customer李四},newOrder{OrderId3,Amount1500,Customer王五}};ListStudentstudentsnewListStudent(){newStudent(){StudentId1,StudentAge10,StudentName小明},newStudent(){StudentId2,StudentAge11,StudentName小红},newStudent(){StudentId3,StudentAge12,StudentName小文}};varmyNewListorders.MyWhere(pp.Amount1000);Console.WriteLine(筛选大于1000的订单的用户);foreach(varorderinmyNewList){Console.WriteLine(${order.Customer}的资产是{order.Amount});}varmyNewStudentListstudents.MyWhere(qq.StudentAge10);Console.WriteLine(筛选年龄大于10岁的学生);foreach(varstudentinmyNewStudentList){Console.WriteLine($学生名{student.StudentName},学生年龄{student.StudentAge});}}}步骤 3手动实现 Select 方法转换 / 投影数据上面我们非常详细的介绍了Where方法是如何实现的这里的Select方法我们就不再从头描述直接给出最终代码。背景需要将数据转换成另一种格式比如订单→只保留 ID 和客户名Select 方法的核心是 “接收转换规则Lambda返回转换后的元素列表”。publicstaticIEnumerableTResultMySelectT,TResult(thisIEnumerableTsource,FuncT,TResultselector){// 健壮性校验if(sourcenull)thrownewArgumentNullException(nameof(source),数据源不能为null);if(selectornull)thrownewArgumentNullException(nameof(selector),转换规则不能为null);// 延迟执行遍历到元素时才转换转换后逐个返回foreach(Titeminsource){TResultconvertedItemselector(item);yieldreturnconvertedItem;// 核心延迟返回转换后的元素}}调用自定义 Select 方法// 在Main方法中// 先筛选再转换金额1000的订单 → 只保留ID和客户名匿名类varsimplifiedOrdersorders.MyWhere(oo.Amount1000)// 自定义Where筛选.MySelect(onew{订单IDo.OrderId,客户o.Customer});// 自定义Select转换Console.WriteLine(\n自定义Select转换结果);foreach(variteminsimplifiedOrders){Console.WriteLine($订单ID{item.订单ID}客户{item.客户});}这里的Select其实和Where没什么太大的区别只不过就是将委托参数变成了FuncT, TResult selector接收的方法传入的是一个T类型输出的是一个新的类型从调用中我们可以知道这里还使用到了匿名函数o new { 订单ID o.OrderId, 客户 o.Customer }这个Lambda表达式的意思就是参数接收一个Order类型的o,返回一个匿名对象这个对象有两个属性一个是订单ID一个是客户。输出自定义Select转换结果 订单ID2客户李四 订单ID3客户王五核心解析MySelect是泛型扩展方法FuncT, TResult selector接收转换规则比如把 Order 转换成匿名类底层还是 foreach 循环调用 Lambda 把每个元素转换成目标格式 —— 原生 LINQ Select 的核心就是这个逻辑。步骤 4手动实现 FirstOrDefault 方法查找第一个元素背景需要快速找第一个符合条件的元素没有则返回默认值比如 null不用写 foreach 遍历找第一个。publicstaticTMyFirstOrDefaultT(thisIEnumerableTsource,FuncT,boolpredicate){// 健壮性校验if(sourcenull)thrownewArgumentNullException(nameof(source),数据源不能为null);if(predicatenull)thrownewArgumentNullException(nameof(predicate),筛选规则不能为null);// 遍历IEnumerableT找到第一个符合条件的元素立即返回无需遍历全部foreach(Titeminsource){if(predicate(item)){returnitem;}}// 无符合条件的元素返回T的默认值引用类型null值类型0等returndefault(T);}调用自定义 FirstOrDefault 方法// 在Main方法中// 找第一个客户是“李四”的订单OrderliSiOrderorders.MyFirstOrDefault(oo.Customer李四);// 找第一个客户是“赵六”的订单不存在返回nullOrderzhaoLiuOrderorders.MyFirstOrDefault(oo.Customer赵六);Console.WriteLine(\n自定义FirstOrDefault查找结果);Console.WriteLine($李四的订单ID{liSiOrder?.OrderId});// 输出2Console.WriteLine($赵六的订单{(zhaoLiuOrdernull?不存在:zhaoLiuOrder.OrderId)});// 输出不存在输出自定义FirstOrDefault查找结果 李四的订单ID2 赵六的订单不存在核心解析底层是 foreach 循环但找到第一个符合条件的元素就立即返回性能比遍历全部高default(T)是泛型默认值引用类型如 Order返回 null值类型如 int返回 0bool 返回 false。三、完整示例用自定义 LINQ 方法处理订单数据usingSystem;usingSystem.Collections.Generic;// 订单/学生实体保持不变publicclassOrder{publicintOrderId{get;set;}publicdecimalAmount{get;set;}publicstringCustomer{get;set;}}publicclassStudent{publicintStudentId{get;set;}publicstringStudentName{get;set;}publicintStudentAge{get;set;}}// 符合官方风格的自定义LINQ扩展类publicstaticclassMyLinqExtensions{#region1. MyWhere基于IEnumerableT 延迟执行/// summary/// 自定义Where筛选符合规则的元素官方风格延迟执行/// /summarypublicstaticIEnumerableTMyWhereT(thisIEnumerableTsource,FuncT,boolpredicate){// 健壮性校验官方LINQ必加if(sourcenull)thrownewArgumentNullException(nameof(source),数据源不能为null);if(predicatenull)thrownewArgumentNullException(nameof(predicate),筛选规则不能为null);// 延迟执行遍历到元素时才判断符合条件则返回foreach(Titeminsource){if(predicate(item)){yieldreturnitem;// 逐个返回不提前创建集合}}}#endregion#region2. MySelect基于IEnumerableT 延迟执行/// summary/// 自定义Select转换数据格式官方风格延迟执行/// /summarypublicstaticIEnumerableTResultMySelectT,TResult(thisIEnumerableTsource,FuncT,TResultselector){// 健壮性校验if(sourcenull)thrownewArgumentNullException(nameof(source),数据源不能为null);if(selectornull)thrownewArgumentNullException(nameof(selector),转换规则不能为null);// 延迟执行遍历到元素时才转换转换后逐个返回foreach(Titeminsource){TResultconvertedItemselector(item);yieldreturnconvertedItem;// 核心延迟返回转换后的元素}}#endregion#region3. MyFirstOrDefault基于IEnumerableT 立即执行/// summary/// 自定义FirstOrDefault找第一个符合规则的元素官方风格适配IEnumerableT/// 注FirstOrDefault语义上是“立即执行”因为要返回具体元素无法延迟/// /summarypublicstaticTMyFirstOrDefaultT(thisIEnumerableTsource,FuncT,boolpredicate){// 健壮性校验if(sourcenull)thrownewArgumentNullException(nameof(source),数据源不能为null);if(predicatenull)thrownewArgumentNullException(nameof(predicate),筛选规则不能为null);// 遍历IEnumerableT找到第一个符合条件的元素立即返回无需遍历全部foreach(Titeminsource){if(predicate(item)){returnitem;}}// 无符合条件的元素返回T的默认值引用类型null值类型0等returndefault(T);}#endregion}classProgram{staticvoidMain(){// 模拟数据源ListOrderordersnewListOrder{newOrder{OrderId1,Amount800,Customer张三},newOrder{OrderId2,Amount1200,Customer李四},newOrder{OrderId3,Amount1500,Customer王五}};// 演示链式调用 延迟执行 Console.WriteLine(1. 定义查询规则此时不执行任何遍历);// 仅定义规则未执行遍历延迟执行varqueryorders.MyWhere(oo.Amount1000)// 筛选高金额订单.MySelect(onew// 转换为简化格式{订单IDo.OrderId,客户o.Customer,折扣金额o.Amount*0.8m}).MyFirstOrDefault(itemitem.折扣金额1000);// 找第一个折扣1000的Console.WriteLine(2. 执行查询FirstOrDefault触发遍历);Console.WriteLine($第一个折扣金额1000的订单);Console.WriteLine($订单ID{query.订单ID}客户{query.客户}折扣金额{query.折扣金额});// 验证MySelect对不同集合的适配性数组 Console.WriteLine(\n3. MySelect适配数组IEnumerableT的通用性);int[]numsnewint[]{1,2,3,4};// 数组转换为“数字10”的新序列varnumResultnums.MySelect(nn10);foreach(varninnumResult){Console.WriteLine($转换后数字{n});// 输出11、12、13、14}}}四、原生 LINQ vs 自定义 LINQ核心一致原生 LINQ 的 Where/Select/FirstOrDefault 和我们手搓的方法核心逻辑完全一致只是原生 LINQ有更完善的异常处理和性能优化支持更多方法OrderBy、GroupBy、Join 等。总结LINQ 的本质是一套基于 “扩展方法 Lambda” 的通用查询框架底层就是 foreach 循环 Lambda 执行规则查询语法只是语法糖核心方法逻辑Where接收FuncT, bool筛选规则返回符合条件的元素Select接收FuncT, TResult转换规则返回转换后的元素FirstOrDefault接收筛选规则返回第一个符合条件的元素无则返回默认值学习关键先理解 “扩展方法 Lambda” 的底层逻辑再使用原生 LINQ就不会只停留在 “会用” 的层面能灵活解决复杂查询场景。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设 算什么做网站的成本有多少钱

25美元DIY智能眼镜完整制作指南:零基础打造你的AI助手 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass 想要拥有一款功能强大的智能眼镜却苦于高昂的价格&#xff…

张小明 2026/3/11 12:49:42 网站建设

网站建设大赛策划书南昌企业网站开发公司

EmotiVoice语音合成引擎的温度参数调节艺术 在虚拟主播深情演绎一首歌曲、客服机器人温柔安抚用户情绪、或是有声书朗读中角色语气自然切换的那一刻,你是否曾好奇:这些富有“人味”的声音背后,究竟是如何被赋予灵魂的? 答案或许…

张小明 2026/3/5 5:34:43 网站建设

myfriv wordpress宁波网站扔优化

MediaMTX流媒体服务器终极指南:零依赖部署与实战应用 【免费下载链接】mediamtx 项目地址: https://gitcode.com/gh_mirrors/med/mediamtx MediaMTX是一款高性能的实时媒体转发服务器,支持RTSP、RTMP、HLS、WebRTC等多种流媒体协议,具…

张小明 2026/3/5 5:34:44 网站建设

深圳松岗 网站建设免费网站流量统计

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…

张小明 2026/3/5 5:34:45 网站建设

学做蛋糕哪个网站好网络推广公司简介

基于LobeChat的客户支持机器人设计与落地案例 在客户服务领域,一个看似简单的问题——“我该怎么重置密码?”——背后往往隐藏着巨大的运营成本。传统客服系统依赖人工响应,面对高频、重复性咨询时,不仅效率低下,还容易…

张小明 2026/3/5 5:34:48 网站建设

做类似淘宝网站怎么做的厦门设计公司有哪些

PyQt富文本与打印功能全解析 在PyQt应用开发中,富文本编辑和打印功能是常见需求。下面将详细介绍相关技术和实现方法。 富文本编辑与扩展 在富文本编辑方面,有一个RichTextLineEdit类,它虽只是单行HTML编辑器,但相关技术可轻松应用于用于编辑整个HTML文档的QTextEdit子类…

张小明 2026/3/5 5:34:49 网站建设