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

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

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

 

一:select中的匿名类型

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

class Program
    {
        static void Main(string[] args)
        {
            var strs = new string[] { "as", "is", "two", "spa" };

            var query = from str in strs
                        let temp = str.ToUpper()
                        where temp.Contains("S")
                        select new { Word = temp, Length = temp.Length };
        }
    }

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

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

 

二:JavaScriptSerializer 中的匿名类型

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

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

class Program
    {
        static void Main(string[] args)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            var json = serializer.Serialize(new { Message = "ok", Code = 20001 });
        }
    }

 

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

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

 

三:linq中的多键关联

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

class Program
    {
        static void Main(string[] args)
        {
            var productList = new List<Product>()
            {
                 new Product() { ProductID=1, ProductName="传奇少女2016春秋新款韩版宽松衬衫连衣裙棉麻质感防晒外套风衣女", SupplierID=1 },
                 new Product() { ProductID=2, ProductName="衬衫女长袖2016春装新款女装韩范春夏上衣衬衣春季百搭长袖打底衫", SupplierID=1 },
                 new Product() { ProductID=3, ProductName="雪纺衬衫女长袖棉立方2016初春新品女装上衣手风琴褶雪纺衫衬衣", SupplierID=2 },
            };

            var orderList = new List<Order>
            {
                new Order() { OrderID=1000001, OrderName="第一个订单", ProductID=1, SupplierID=1 },
                new Order() { OrderID=1000002, OrderName="第二个订单", ProductID=3, SupplierID=2 },
                new Order() { OrderID=1000003, OrderName="第三个订单", ProductID=2, SupplierID=2 }
            };

            var query = from p in productList
                        join o in orderList
                        on p.ProductID equals o.ProductID
                        select new
                        {
                            ProductID = p.ProductID,
                            ProductName = p.ProductID,
                            OrderID = o.OrderID,
                            OrderName = o.OrderName,
                            SupplierID = p.SupplierID
                        };
        }
    }

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

 

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

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

var query = from p in productList
                        join o in orderList
                        on new { ProductID = p.ProductID, SupplierID = p.SupplierID } equals new { ProductID = o.ProductID, SupplierID = o.SupplierID }
                        select new
                        {
                            ProductID = p.ProductID,
                            ProductName = p.ProductID,
                            OrderID = o.OrderID,
                            OrderName = o.OrderName,
                            SupplierID = p.SupplierID
                        };

 

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

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

 

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

时间: 2024-08-02 13:46:08

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

Linq专题之提高编码效率—— 第一篇 Aggregate方法

我们知道linq是一个很古老的东西,大家也知道,自从用了linq,我们的foreach少了很多,但有一个现实就是我们在实际应用中使用到的却是屈指可数 的几个方法,这个系列我会带领大家看遍linq,好的,废话不多说,先从Aggregate这个貂毛说起. 一:应用场景 前不久在写一个项目的时候,我需要捞取营销活动,刚好营销活动有两个类型,一种是普通活动,一个是触发式活动,由于存放在两张表中,并且捞取 之后需要做一些实体的转存,等等计算,所以就有了类似这样的代码. namespace ConsoleA

Linq专题之提高编码效率—— 第三篇 你需要知道的枚举类

众所周知,如果一个类可以被枚举,那么这个类必须要实现IEnumerable接口,而恰恰我们所有的linq都是一个继承自IEnumerable接口的匿名类, 那么问题就来了,IEnumerable使了何等神通让这些集合类型可以被自由的枚举??? 一: 探索IEnumerable 首先我们看看此接口都定义了些什么东西,如ILSpy所示: 从这个接口中,好像也仅仅有一个IEnumerator接口类型的方法之外,并没有可以挖掘的东西,这时候大家就应该好奇了,foreach既然可以枚举Collection

JavaWeb开发入门第二篇Tomcat服务器配置讲解_java

一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml配置文件中的Connector节点进行的端口修改 例如:将Tomcat服务器的启动端口由默认的8080改成8081端口 Tomcat服务器启动端口默认配置 <Connector port="8080" protocol="HTTP/1.1" connectionT

BOM系列第二篇之定时器requestAnimationFrame_javascript技巧

引入 计时器一直是javascript动画的核心技术.而编写动画循环的关键是要知道延迟时间多长合适.一方面,循环间隔必须足够短,这样才能让不同的动画效果显得平滑流畅:另一方面,循环间隔还要足够长,这样才能确保浏览器有能力渲染产生的变化 大多数电脑显示器的刷新频率是60Hz,大概相当于每秒钟重绘60次.大多数浏览器都会对重绘操作加以限制,不超过显示器的重绘频率,因为即使超过那个频率用户体验也不会有提升.因此,最平滑动画的最佳循环间隔是lOOOms/60,约等于16.6ms 而setTimeout和

解剖SQLSERVER 第二篇 对数据页面头进行逆向(译)

原文:解剖SQLSERVER 第二篇 对数据页面头进行逆向(译) 解剖SQLSERVER 第二篇  对数据页面头进行逆向(译) http://improve.dk/reverse-engineering-sql-server-page-headers/ 在开发OrcaMDF 的时候第一个挑战就是解析数据页面头部,我们知道数据页面分两部分,96字节的页面头部和8096字节的数据行 大神 Paul Randal 写了一篇文章很好的描述了页头结构,然而,即使文章描述得很详细,但是我还是找不出任何关于页

奥巴马在美国国会发表了上任以来的第二篇国情咨文

今年1月25日,美国总统奥巴马在美国国会发表了上任以来的第二篇国情咨文.奥巴马一个小时的演讲中,"赢得未来"成为高频率出现的主题词.他提出,赢得未来的第三步是"重建美国基础设施",其中最重要的是要在未来5年内向98%的美国人提供下一代高速互联网. 而在2月3日,互联网域名管理机构(ICANN)于美国迈阿密宣布:IPv4地址库已经告罄,这是世界互联网的重大历史事件.也意味着新一代互联网进入了加快建造的时代,由此更需要从全球互联网的顶端高度理解新的IPv6地址模式所带来

ASP.NET自定义控件组件开发 第一章 第二篇 接着待续

很感谢大家给我的第一篇ASP.NET控件开发的支持!在写这些之前,我也看了一些例子,想选中一些好 上手的例子,这样,可能一些例子大家以前都见过,但是我想说:同样是弹钢琴,同样一首"命运交响曲 ",有的人弹的让人荡气回肠,有的人弹的就很一般. 受了李建忠老师的启发,发现用一种演化式的让人更好的接受. 好了,废话不说了.继续开发!希望大家支持! 我们之前开发了一个很简单的自定义的控件,方法很简单,只是把原来的html文本传入 writer.Writer()方法的参数,然后输出.其实从模式的

「C语言回顾之旅」第二篇:指针详解进阶

说明:     第一篇回顾了指针的基本概念以及基本使用,因此对指针也有了一个较为清晰的思路,但实际上第一篇关于指针的内容是不太容易忘记的.这是第二篇中的内容是比较容易混淆,但对于指针的进一步学习也是非常重要的. 一.指向函数的指针 1.函数指针 ·函数指针即指向函数的指针,函数指针值为函数的入口地址,通过使用该指针,即可以使用该函数: ·编写一个程序返回两个数的最大值,通过函数指针调用函数: a.main函数代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Android开源项目第二篇——工具库篇

Android开源项目第二篇--工具库篇 本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他.   最新内容请访问AndroidOpenProject@Github,欢迎Star和Fork.   Android开源项目系列汇总已完成,包括: Android开源项目第一篇--个性化控件(View)篇Android开源项目第二篇--工具库