Linq专题之提高编码效率—— 第一篇 Aggregate方法
<p> 我们知道linq是一个很古老的东西,大家也知道,自从用了linq,我们的foreach少了很多,但有一个现实就是我们在实际应用中使用到的却是屈指可数</p><p>的几个方法,这个系列我会带领大家看遍linq,好的,废话不多说,先从Aggregate这个貂毛说起。</p>
<p> </p>
<p><span style="font-size: 18pt">一:应用场景</span></p>
<p> 前不久在写一个项目的时候,我需要捞取营销活动,刚好营销活动有两个类型,一种是普通活动,一个是触发式活动,由于存放在两张表中,并且捞取</p>
<p>之后需要做一些实体的转存,等等计算,所以就有了类似这样的代码。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> ConsoleApplication1
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> Dictionary<<span style="color: rgba(0, 0, 255, 1)">int</span>, List<Marketing>> dic = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary<<span style="color: rgba(0, 0, 255, 1)">int</span>, List<Marketing>><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">普通活动</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (!dic.ContainsKey(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">11</span> dic[<span style="color: rgba(128, 0, 128, 1)">1</span>] = <span style="color: rgba(0, 0, 255, 1)">new</span> List<Marketing><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)">12</span> dic[<span style="color: rgba(128, 0, 128, 1)">1</span>].Add(<span style="color: rgba(0, 0, 255, 1)">new</span> Marketing() { MarketingID = <span style="color: rgba(128, 0, 128, 1)">1</span>, MarketingName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">普通活动1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">13</span> dic[<span style="color: rgba(128, 0, 128, 1)">1</span>].Add(<span style="color: rgba(0, 0, 255, 1)">new</span> Marketing() { MarketingID = <span style="color: rgba(128, 0, 128, 1)">1</span>, MarketingName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">普通活动2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">事件活动</span>
<span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (!dic.ContainsKey(<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">17</span> dic[<span style="color: rgba(128, 0, 128, 1)">2</span>] = <span style="color: rgba(0, 0, 255, 1)">new</span> List<Marketing><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)">18</span> dic[<span style="color: rgba(128, 0, 128, 1)">2</span>].Add(<span style="color: rgba(0, 0, 255, 1)">new</span> Marketing() { MarketingID = <span style="color: rgba(128, 0, 128, 1)">3</span>, MarketingName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">事件活动1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">19</span> dic[<span style="color: rgba(128, 0, 128, 1)">2</span>].Add(<span style="color: rgba(0, 0, 255, 1)">new</span> Marketing() { MarketingID = <span style="color: rgba(128, 0, 128, 1)">4</span>, MarketingName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">事件活动2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">22</span>
<span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Marketing
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> MarketingID { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 128, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> MarketingName { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">29</span> }</pre>
</div>
<p>然后我经过一系列运算之后,又需要把字典中的key=1和key=2的数据扁平到一个list中,那么这个简单的计算该怎么做到呢???</p>
<p> </p>
<p><span style="font-size: 14pt">普通的做法:</span> 需要先定义一个List变量,然后一个foreach搞定。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> List<Marketing> marketingList = <span style="color: rgba(0, 0, 255, 1)">new</span> List<Marketing><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> key <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> dic.Keys)
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)"> marketingList.AddRange(dic);
</span><span style="color: rgba(0, 128, 128, 1)">5</span> }</pre>
</div>
<p> 如果你不会用Aggregate的话,你会觉得这个方法已经非常极致了。。。而事实呢???我们应该还有更牛逼的做法!!!</p>
<p> </p>
<p><span style="font-size: 14pt">牛逼的做法:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">var</span> marketingList = dic.Keys.Aggregate(Enumerable.Empty<Marketing>(), (total, next) =>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> total.Union(dic);
</span><span style="color: rgba(0, 128, 128, 1)">4</span> });</pre>
</div>
<p><img src="https://images2015.cnblogs.com/blog/214741/201602/214741-20160221113538858-1028342393.png" alt=""></p>
<p>有没有看到,用lamda这种写法多么的连贯,没有第一种写法上的断层,当然很多框架上都有Aggregate这种聚合计算,比如mongodb中同样也有</p>
<p>Aggregate,下面我们用ILSpy看看Aggregate这种魔法化的代码是怎么实现的。</p>
<p> </p>
<p><span style="font-size: 18pt">二:探究源码</span></p>
<p> 当你看到源码的时候,是不是有一种亮瞎眼的感觉,所谓的Aggregate在内部其实也仅仅是“普通做法”一模一样的源代码。。。而Aggregate仅仅做的</p>
<p>是一层代码封装,这样也好,提高了我们开发效率,对吧,如下图:</p>
<p><img src="https://images2015.cnblogs.com/blog/214741/201602/214741-20160221112201045-524892078.png" alt=""></p>
<p> </p>
<p>从图中我们看到了Aggregate有三种重载方法,本篇刚好用到的是第二种重载,第一种看起来就更简单了,对吧,更何况我们有ILSpy,欢迎大家自行</p>
<p>探索,本篇就说到这里了,感谢支持~~~</p>
<p> </p>
<p>————————————————————————————————————————————————————————————</p>
<p>————————————————————————————————————————————————————————————</p>
<p>友情提示:如果不喜欢看文章,可以移步本系列的 <span style="font-size: 18pt">完整版Linq视频教程</span> 【一包烟的钱哦<img src="https://images2015.cnblogs.com/blog/214741/201512/214741-20151222232141843-637158935.gif" alt="">】</p>
<p>————————————————————————————————————————————————————————————</p>
<p>————————————————————————————————————————————————————————————</p><br><br>
来源:https://www.cnblogs.com/huangxincheng/p/5204645.html
頁:
[1]