Linq专题之提高编码效率—— 第一篇 Aggregate方法
我们知道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方法的更多相关文章
- Linq专题之提高编码效率—— 第二篇 神一样的匿名类型
说起匿名类型,我们都知道这玩意都是为linq而生,而且匿名类型给我们带来的便利性大家在实战中应该都体会到了,特别适合于一次性使用,临时 使用这些场景,虽然说是匿名类型,也就是说是有类型的,只是匿名了而 ...
- Linq专题之提高编码效率—— 第三篇 你需要知道的枚举类
众所周知,如果一个类可以被枚举,那么这个类必须要实现IEnumerable接口,而恰恰我们所有的linq都是一个继承自IEnumerable接口的匿名类, 那么问题就来了,IEnumerable使了 ...
- 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变
在net中json序列化与反序列化 准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...
- LINQ to XML LINQ学习第一篇
LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...
- (第一篇) 一步一步带你了解linq to Object
要想学好linq to object 我们必须要先学习lambda 表达式,学习lambda 表达式呢我们必须了解匿名函数和匿名类及扩展方法,学习匿名函数,我们必须学会委托,这是本文的宗旨.下面开始第 ...
- 跟初学者学习IbatisNet第一篇
写在前面的话:我自己也是一个初学者,写这个专题只是为了对学过知识的巩固,如果有什么不对的地方,欢迎大家指正…………………… 第一篇就简单介绍一下什么是IbatisNet,然后写一个简单的Demo,在后 ...
- Entity Framework 6.0 入门系列 第一篇
Entity Framework 6.0 入门系列 第一篇 好几年前接触过一些ef感觉不是很好用,废弃.但是 Entity Framework 6.0是经过几个版本优化过的产物,性能和功能不断完善,开 ...
- Django之模型层第一篇:单表操作
Django之模型层第一篇:单表操作 一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数 ...
- 空格哥的第一篇Blog
首先十分感谢博客园在这里给我的平台,我在这里学习到了很多东西,响应的,我也想要在这里记录下自己的心路历程!在学习的过程中,希望博客园一直陪伴我,小弟在这里不胜感激!这是小弟的第一篇博客,很多东西都不是 ...
随机推荐
- 在IE11下设置SharePoint Server 2013却遇到“需要 Internet Explorer 才能使用此功能。”的解决办法
就在昨天顺利升级到Windows 8.1 随之IE也升级到了IE11,但是当打开IE11设置SharePoint Server 2013的时候遇到了一些小情况: Figure 1使用Windows 8 ...
- 倾情大奉送--Spark入门实战系列
这一两年Spark技术很火,自己也凑热闹,反复的试验.研究,有痛苦万分也有欣喜若狂,抽空把这些整理成文章共享给大家.这个系列基本上围绕了Spark生态圈进行介绍,从Spark的简介.编译.部署,再到编 ...
- 原创:经验分享:微信小程序外包接单常见问题及流程
从九月底内测到现在已经三个半月.凌晨一点睡觉已经习以为常,也正是这样,才让无前端经验的我做微信小程序开发并不感到费劲.最近才开始接微信小程序的外包项目,目前已经签下了五份合同,成品出了两个.加上转给朋 ...
- Java中的反射和注解
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
- 无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Word._Application”。
无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Wor ...
- 一个网站完整详细的SEO优化方案
根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...
- PHP5各个版本的新功能和新特性总结
因为 PHP 那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征 本文目录:PHP5.2 以前:auto ...
- Visual Studio 2015在.NET Core RC2项目中的一个错误。
更新了.NET Core RC2 之后,VS的Web Tools更新为“Preview 1”了. 这个版本有一个问题,害我折腾了一个下午. 就是在项目界面的“依赖项 - NPM”上面错误地显示了不必要 ...
- 【C#】ConcurrentBag<T> 方法
转载自MSDN. ConcurrentBag<T> 类型公开以下成员. 方法 显示: 继承 保护 名称 说明 Add 将对象添加到 ConcurrentBag<T> ...
- HTTP协议详解
Author :Jeffrey 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...