我们知道linq是一个很古老的东西,大家也知道,自从用了linq,我们的foreach少了很多,但有一个现实就是我们在实际应用中使用到的却是屈指可数

的几个方法,这个系列我会带领大家看遍linq,好的,废话不多说,先从Aggregate这个貂毛说起。

一:应用场景

  前不久在写一个项目的时候,我需要捞取营销活动,刚好营销活动有两个类型,一种是普通活动,一个是触发式活动,由于存放在两张表中,并且捞取

之后需要做一些实体的转存,等等计算,所以就有了类似这样的代码。

 namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Dictionary<int, List<Marketing>> dic = new Dictionary<int, List<Marketing>>(); //普通活动
if (!dic.ContainsKey())
dic[] = new List<Marketing>();
dic[].Add(new Marketing() { MarketingID = , MarketingName = "普通活动1" });
dic[].Add(new Marketing() { MarketingID = , MarketingName = "普通活动2" }); //事件活动
if (!dic.ContainsKey())
dic[] = new List<Marketing>();
dic[].Add(new Marketing() { MarketingID = , MarketingName = "事件活动1" });
dic[].Add(new Marketing() { MarketingID = , MarketingName = "事件活动2" });
}
} class Marketing
{
public int MarketingID { get; set; } public string MarketingName { get; set; }
}
}

然后我经过一系列运算之后,又需要把字典中的key=1和key=2的数据扁平到一个list中,那么这个简单的计算该怎么做到呢???

普通的做法: 需要先定义一个List变量,然后一个foreach搞定。

             List<Marketing> marketingList = new List<Marketing>();
foreach (var key in dic.Keys)
{
marketingList.AddRange(dic[key]);
}

如果你不会用Aggregate的话,你会觉得这个方法已经非常极致了。。。而事实呢???我们应该还有更牛逼的做法!!!

牛逼的做法:

             var marketingList = dic.Keys.Aggregate(Enumerable.Empty<Marketing>(), (total, next) =>
{
return total.Union(dic[next]);
});

有没有看到,用lamda这种写法多么的连贯,没有第一种写法上的断层,当然很多框架上都有Aggregate这种聚合计算,比如mongodb中同样也有

Aggregate,下面我们用ILSpy看看Aggregate这种魔法化的代码是怎么实现的。

二:探究源码

当你看到源码的时候,是不是有一种亮瞎眼的感觉,所谓的Aggregate在内部其实也仅仅是“普通做法”一模一样的源代码。。。而Aggregate仅仅做的

是一层代码封装,这样也好,提高了我们开发效率,对吧,如下图:

从图中我们看到了Aggregate有三种重载方法,本篇刚好用到的是第二种重载,第一种看起来就更简单了,对吧,更何况我们有ILSpy,欢迎大家自行

探索,本篇就说到这里了,感谢支持~~~

————————————————————————————————————————————————————————————

————————————————————————————————————————————————————————————

友情提示:如果不喜欢看文章,可以移步本系列的 完整版Linq视频教程 【一包烟的钱哦

————————————————————————————————————————————————————————————

————————————————————————————————————————————————————————————

Linq专题之提高编码效率—— 第一篇 Aggregate方法的更多相关文章

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

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

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

     众所周知,如果一个类可以被枚举,那么这个类必须要实现IEnumerable接口,而恰恰我们所有的linq都是一个继承自IEnumerable接口的匿名类, 那么问题就来了,IEnumerable使了 ...

  3. 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变

    在net中json序列化与反序列化   准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...

  4. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  5. (第一篇) 一步一步带你了解linq to Object

    要想学好linq to object 我们必须要先学习lambda 表达式,学习lambda 表达式呢我们必须了解匿名函数和匿名类及扩展方法,学习匿名函数,我们必须学会委托,这是本文的宗旨.下面开始第 ...

  6. 跟初学者学习IbatisNet第一篇

    写在前面的话:我自己也是一个初学者,写这个专题只是为了对学过知识的巩固,如果有什么不对的地方,欢迎大家指正…………………… 第一篇就简单介绍一下什么是IbatisNet,然后写一个简单的Demo,在后 ...

  7. Entity Framework 6.0 入门系列 第一篇

    Entity Framework 6.0 入门系列 第一篇 好几年前接触过一些ef感觉不是很好用,废弃.但是 Entity Framework 6.0是经过几个版本优化过的产物,性能和功能不断完善,开 ...

  8. Django之模型层第一篇:单表操作

    Django之模型层第一篇:单表操作 一 ORM简介 ​ 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数 ...

  9. 空格哥的第一篇Blog

    首先十分感谢博客园在这里给我的平台,我在这里学习到了很多东西,响应的,我也想要在这里记录下自己的心路历程!在学习的过程中,希望博客园一直陪伴我,小弟在这里不胜感激!这是小弟的第一篇博客,很多东西都不是 ...

随机推荐

  1. IE 11 如何设置“用户代理字符串”

    "用户代理字符串"这个术语在IE11 之前被叫作“浏览器模式”(Browser Mode),在IE11下面这个特殊的选项被放在F12的“仿真”选项下面了. Figure 1通过按下 ...

  2. 原创:微信小程序入口猜想?

    昨天看到一篇文章:是有一个人逆向了微信源码,从中发现了很多关于小程序的未公开内容,然后发布了出来,不过很快作者就删掉了文章,而我也没保留,只是隐约留下来一点点印象,就是作者推测了很多个入口:作者删掉的 ...

  3. (十七)WebGIS中距离及面积测量的原理和实现以及坐标转换的简单介绍

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在这一章里我们将讨论基础工具栏中另外两个常用工具:距离测量工 ...

  4. error when loading the sdk error parsing

    Error Parsing: C:\android-sdk_r24.2-windows\android-sdk-windows\system-images\android-22\android-wea ...

  5. PHP+MYSQL网站SQL Injection攻防

    程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过.其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报 ...

  6. 【C#】ConcurrentBag<T> 方法

    转载自MSDN. ConcurrentBag<T> 类型公开以下成员. 方法     显示: 继承 保护   名称 说明 Add 将对象添加到 ConcurrentBag<T> ...

  7. php实现hack中的Shape特性

    用php进行静态类型编程,估计是我的一个心结. 依次有几篇文章都记录了我的一些探索: 通过指定函数/方法形参类型提高PHP代码可靠性 http://www.cnblogs.com/x3d/p/4285 ...

  8. jqgrid学习笔记(转载)

    jqgrid中文帮助文档网址:http://blog.mn886.net/jqGrid/ jqgrid:用来做什么? jqgrid是web端前台表格控件,用它可以轻松将数据格式化显示,前后台用过aja ...

  9. 从零开始学Python08作业思路:开发简单的FTP

    一,作业要求 开发简单的FTP 1,用户登录 2,上传/下载文件 3,不同用户家目录不同 4,查看当前目录下文件 5,充分使用面向对象 二,程序文件清单 Folder目录:用户上传文件家目录 db目录 ...

  10. C - NP-Hard Problem

    C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:262144 ...