首页 > 其他分享 >Linq专题之提高编码效率—— 第二篇 神一样的匿名类型

Linq专题之提高编码效率—— 第二篇 神一样的匿名类型

时间:2023-04-18 12:34:56浏览次数:42  
标签:SupplierID Linq 匿名 linq 类型 new 第二篇 ProductID

说起匿名类型,我们都知道这玩意都是为linq而生,而且匿名类型给我们带来的便利性大家在实战中应该都体会到了,特别适合于一次性使用,临时

使用这些场景,虽然说是匿名类型,也就是说是有类型的,只是匿名了而已,对吧,这篇我们就来探索下匿名类型到底和linq有多大关系呢???

 

一:select中的匿名类型

  这个我想大家用的是最多的,毕竟你select之后需要把原始数据重塑成另一种形状展示出来,不信你看嘛!!!

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var strs = new string[] { "as", "is", "two", "spa" };
 6 
 7             var query = from str in strs
 8                         let temp = str.ToUpper()
 9                         where temp.Contains("S")
10                         select new { Word = temp, Length = temp.Length };
11         }
12     }

Linq专题之提高编码效率—— 第二篇 神一样的匿名类型_List

从上面的代码中,你可以看到,原来只是一个string数组,经过linq整合之后就成了一个IEnumerable集合的匿名类集合,并且成功的把每个字符串大写化

并且统计每个字符串的长度,也体现了匿名类型的临时性。

 

二:JavaScriptSerializer 中的匿名类型

     这个类型我想大家都清楚,不过性能更高的方式应该是用JsonConvert吧,但这个不是本篇讨论的话题,我们重点来看看匿名类型的Json序列化能给我们

带来多大的便利性,比如下面这样:

1     class Program
2     {
3         static void Main(string[] args)
4         {
5             JavaScriptSerializer serializer = new JavaScriptSerializer();
6 
7             var json = serializer.Serialize(new { Message = "ok", Code = 20001 });
8         }
9     }

Linq专题之提高编码效率—— 第二篇 神一样的匿名类型_List_02

 

从上图中可以看到,其实我并没有显式的定义一个model,而是定义了一个匿名的model,这个model具有Message和Code字段,这样我们就可以直接序

列化了,是不是很方便呢??

 

三:linq中的多键关联

  当我们用linq做两个集合的关联时,会用到on...equals...或者就是两个from...from....where 解决,而且通常情况下只有一个键的关联,比如下面这样:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var productList = new List<Product>()
 6             {
 7                  new Product() { ProductID=1, ProductName="传奇少女2016春秋新款韩版宽松衬衫连衣裙棉麻质感防晒外套风衣女", SupplierID=1 },
 8                  new Product() { ProductID=2, ProductName="衬衫女长袖2016春装新款女装韩范春夏上衣衬衣春季百搭长袖打底衫", SupplierID=1 },
 9                  new Product() { ProductID=3, ProductName="雪纺衬衫女长袖棉立方2016初春新品女装上衣手风琴褶雪纺衫衬衣", SupplierID=2 },
10             };
11 
12             var orderList = new List<Order>
13             {
14                 new Order() { OrderID=1000001, OrderName="第一个订单", ProductID=1, SupplierID=1 },
15                 new Order() { OrderID=1000002, OrderName="第二个订单", ProductID=3, SupplierID=2 },
16                 new Order() { OrderID=1000003, OrderName="第三个订单", ProductID=2, SupplierID=2 }
17             };
18 
19             var query = from p in productList
20                         join o in orderList
21                         on p.ProductID equals o.ProductID
22                         select new
23                         {
24                             ProductID = p.ProductID,
25                             ProductName = p.ProductID,
26                             OrderID = o.OrderID,
27                             OrderName = o.OrderName,
28                             SupplierID = p.SupplierID
29                         };
30         }
31     }

由于数据是伪造的,所以就不考虑逻辑性,而是专注于linq语法层次,好了,上面这样的linq,我们看看最后的结果会是怎么样的。

Linq专题之提高编码效率—— 第二篇 神一样的匿名类型_List_03

 

可以看到我们从数据库中读取到了三条数据,而且这时候我们equal中的条件是on p.ProductID equals o.ProductID,现在需求扑面而来了,如果我

不仅要判断ProductID,还要判断SupplierID也要相等,这样的需求特么的怎么搞呢??? 那就看看我是怎么搞的哈!!!

 1  var query = from p in productList
 2                         join o in orderList
 3                         on new { ProductID = p.ProductID, SupplierID = p.SupplierID } equals new { ProductID = o.ProductID, SupplierID = o.SupplierID }
 4                         select new
 5                         {
 6                             ProductID = p.ProductID,
 7                             ProductName = p.ProductID,
 8                             OrderID = o.OrderID,
 9                             OrderName = o.OrderName,
10                             SupplierID = p.SupplierID
11                         };

Linq专题之提高编码效率—— 第二篇 神一样的匿名类型_字符串_04

 

看到没有,标成红色的就是代码的核心,正好我们利用到了匿名类型的equals重写方法,就是因为这个重写解决了多条件的问题,是不是很强大,下面

再简单看看匿名类型的equals是怎么被重写的。

Linq专题之提高编码效率—— 第二篇 神一样的匿名类型_字符串_05

 

从图中可以看到,匿名类型就是追个字段的equals方法比较是否相等的,好了,到现在为止你应该明白了匿名类型对于linq来说是多么的重要啦~~~

 

标签:SupplierID,Linq,匿名,linq,类型,new,第二篇,ProductID
From: https://blog.51cto.com/u_15353947/6202812

相关文章

  • 15天玩转redis —— 第二篇 基础的字符串类型
        我们都知道redis是采用C语言开发,那么在C语言中表示string都是采用char[]数组的,然后你可能会想,那还不简单,当我执行如下命令,肯定是直接塞给char[]数组的。如果你真的这么想的话,会有几个问题就要过来砍你了,先我们来找一个redis手册,http://doc.redisfans.com/ 第......
  • [企业管理]如何与一个纯技术的老板合作第二篇
    今天写了一点关于邱老的看法的看法。于是就想随手把后续的这个话题延续一下。老板背景这个前老板是上世纪八十年代公费出国留学的那一批人,毕业后,没有回国,而是去了亚洲南部的一个小国(经济较发达)的一个著名的大学院校当了10年副教授,然后,去了某著名国际公司的亚洲研究院做了四年研究员......
  • 第二篇——通达信怎么编写指标公式以及通达信公式的使用方法(从零起步编写通达信指标公
    内容提要:本文主要介绍了通达信指标公式编写入口、公式的类型、公式编辑器的使用,此外介绍了四种公式类型的区别以及使用方法,让大家对通达信指标公式如何编写有个大概的了解。 一、公式管理器公式管理器是编写、导入导出公式的入口。一般在通达信的右上方可以找到。“公式......
  • Java基础知识点内部类之局部内部类和匿名内部类
    一:局部内部类1概述:将内部类定义在方法里面就叫做局部内部类。类似于方法里面的局部变量。2.注意点:外界无法直接使用,需要在方法内部创建对象并使用。3.该类可以直接访问外部类成员,也可以访问方法内的局部变量。publicclassOuter{publicstaticvoidshow(){......
  • 02_JAVA匿名内部类
    匿名对象就是没有名字的对象匿名对象的应用场景A:调用方法,仅仅只调用一次的时候。(调用多次的时候不适合,且匿名对象调用完毕就是垃圾,可以被回收器回收)//newStudent().show();B:匿名对象可以作为实际参数传递。StudentDemosd=newsStudentDemo();//Studentss=newSt......
  • C# 匿名类型之 RuntimeBinderException
    匿名类型在某些场景下使用起来还是比较方便,比如某个类型只会使用一次,那这个时候定义一个Class就没有多少意义,完全可以使用匿名类型来解决,但是在跨项目使用时,还是需要注意避免出现RuntimeBinderException问题问题描述比如我们有一个netstandard2.0类型的类库项目,里面有一......
  • C#版本LINQ增强开源库
    LINQ对应的中文名称是:语言集成查询,是对一系列直接将查询功能集成到C#语言技术的统称,我们最常用的场景是,用于数据库的查询功能。在.Net中,本身对Objects也支持LINQ的扩展,但是对于一些特定的功能,就需要我们自己去扩展。所以,今天给大家推荐一个LINQ扩展库,主要是针对“LINQtoObject......
  • 在LINQPad中使用FreeSql查询数据库
    如何在LINQPad中使用FreeSqlLINQPad是一款强大的C#交互式编程环境,它可以让你轻松地编写和测试C#代码片段。除了作为一个交互式编程环境,LINQPad还可以用来连接各种数据源,包括SQL数据库、NoSQL数据库、Web服务等等。此外,LINQPad还支持使用NuGet包管理器来安装和管理第三方库。有时......
  • Docker快速入门 第二篇
    目录Docker一、Iass-Paas和Saas1、简介二、Docker常用命令1、镜像站设置2、启动/停止常用命令三、镜像命令相关四、容器相关命令Docker一、Iass-Paas和Saas1、简介什么是lass-Pass和Saas:#Iaas:Infrastructure-as-a-Service(基础设施即服务) IaaS公司会提供场外服务器,存储......
  • 第二篇 手写原理代码 - 函数【 函数防抖 、函数节流 】
    函数防抖和函数节流都是优化高频事件处理的JavaScript技术。它们可以限制函数的调用,在一定程度上减少计算、网络请求和提高响应速度,但它们的实现方式略有不同函数防抖:延迟执行函数,只有在事件停止后才会执行最后一次事件函数节流:定期执行函数,每隔一段时间执行一次通常情况下,......