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
首先十分感谢博客园在这里给我的平台,我在这里学习到了很多东西,响应的,我也想要在这里记录下自己的心路历程!在学习的过程中,希望博客园一直陪伴我,小弟在这里不胜感激!这是小弟的第一篇博客,很多东西都不是 ...
随机推荐
- Node.js、Express框架获取客户端IP地址
Node.js //传入请求HttpRequest function getClientIp(req) { return req.headers['x-forwarded-for'] || req.c ...
- 你真的会玩SQL吗?删除重复数据且只保留一条
在网上看过一些解决方法 我在此给出的方法适用于无唯一ID的情形 表:TB_MACVideoAndPicture 字段只有2个:mac,content mac作为ID,正常情况下mac数据是唯一的,由于 ...
- PR&AE插件开发遇到的一个坑
经过一段时间的摸索,对Adobe Premiere Pro和After Effects系列插件的开发工作有了一定的掌握.如今公司需要针对Premiere Pro和After Effects开发另外一款 ...
- [Asp.net 5] Logging-日志系统的基本架构(上)
本节主要介绍解决方案中的Microsoft.Framework.Logging.Abstractions.Microsoft.Framework.Logging俩个工程. 这俩个工程中所有类的关系如下 ...
- C#循环测试题
关于如下程序结构的描述中,哪一项是正确的? for ( ; ; ) { 循环体; //何问起 } a) 不执行循环体b) 一直执行循环体,即死循环c) 执行循环体一次d) 程序不符合语法要 ...
- [moka同学笔记]五、Yii2.0课程笔记(魏曦老师教程)[审核功能]
- DecoratorPattern(装饰器模式)
/** * 装饰者模式 * @author TMAC-J * 总的来说,装饰者模式就是继承的应用 */ public class DecoratorPattern { interface Beans{ ...
- PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解
1.安装PowerDesigner15.MySQL5.不详细讲解了.网上一大把.请各位亲参考去. 2.安MyODBC-standard-3.51.0.7-win.msi.mysql-connector ...
- css之颜色值、单位
颜色值 英文命令颜色:p{color:red;} RGB颜色:p{color:rgb(133,45,200);}每一项的值可以是 0~255 之间的整数,也可以是 0%~100% 的百分数.如:p{c ...
- transformjs:让天下没有难做的生意!不对,是特效!
写在前面 transform是css3新增的一个属性,可是令开发者费解的是,其内部又有大量的属性如旋转.缩放.扭曲.平移,这也就导致了获取或者是设置transform中一个或者多个属性变得异常麻烦. ...