Linq專題之提升編碼效率—— 第一篇 Aggregate方法

  咱們知道linq是一個很古老的東西,你們也知道,自從用了linq,咱們的foreach少了不少,但有一個現實就是咱們在實際應用中使用到的倒是屈指可數mongodb

的幾個方法,這個系列我會帶領你們看遍linq,好的,廢話很少說,先從Aggregate這個貂毛提及。框架

 

一:應用場景spa

  前不久在寫一個項目的時候,我須要撈取營銷活動,恰好營銷活動有兩個類型,一種是普通活動,一個是觸發式活動,因爲存放在兩張表中,而且撈取code

以後須要作一些實體的轉存,等等計算,因此就有了相似這樣的代碼。視頻

 1 namespace ConsoleApplication1
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Dictionary<int, List<Marketing>> dic = new Dictionary<int, List<Marketing>>();
 8 
 9             //普通活動
10             if (!dic.ContainsKey(1))
11                 dic[1] = new List<Marketing>();
12             dic[1].Add(new Marketing() { MarketingID = 1, MarketingName = "普通活動1" });
13             dic[1].Add(new Marketing() { MarketingID = 1, MarketingName = "普通活動2" });
14 
15             //事件活動
16             if (!dic.ContainsKey(2))
17                 dic[2] = new List<Marketing>();
18             dic[2].Add(new Marketing() { MarketingID = 3, MarketingName = "事件活動1" });
19             dic[2].Add(new Marketing() { MarketingID = 4, MarketingName = "事件活動2" });
20         }
21     }
22 
23     class Marketing
24     {
25         public int MarketingID { get; set; }
26 
27         public string MarketingName { get; set; }
28     }
29 }

而後我通過一系列運算以後,又須要把字典中的key=1和key=2的數據扁平到一個list中,那麼這個簡單的計算該怎麼作到呢???htm

 

普通的作法: 須要先定義一個List變量,而後一個foreach搞定。blog

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

 若是你不會用Aggregate的話,你會以爲這個方法已經很是極致了。。。而事實呢???咱們應該還有更牛逼的作法!!!教程

 

牛逼的作法:事件

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

有沒有看到,用lamda這種寫法多麼的連貫,沒有第一種寫法上的斷層,固然不少框架上都有Aggregate這種聚合計算,好比mongodb中一樣也有開發

Aggregate,下面咱們用ILSpy看看Aggregate這種魔法化的代碼是怎麼實現的。

 

二:探究源碼

   當你看到源碼的時候,是否是有一種亮瞎眼的感受,所謂的Aggregate在內部其實也僅僅是「普通作法」如出一轍的源代碼。。。而Aggregate僅僅作的

是一層代碼封裝,這樣也好,提升了咱們開發效率,對吧,以下圖:

 

從圖中咱們看到了Aggregate有三種重載方法,本篇恰好用到的是第二種重載,第一種看起來就更簡單了,對吧,更況且咱們有ILSpy,歡迎你們自行

探索,本篇就說到這裏了,感謝支持~~~

 

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

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

友情提示:若是不喜歡看文章,能夠移步本系列的 完整版Linq視頻教程 【一包煙的錢哦

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

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

相關文章
相關標籤/搜索