程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Linq專題之提高編碼效率—— 第一篇 Aggregate方法

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

編輯:關於.NET

  我們知道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(1))
                 dic[1] = new List<Marketing>();
             dic[1].Add(new Marketing() { MarketingID = 1, MarketingName = "普通活動1" });
             dic[1].Add(new Marketing() { MarketingID = 1, MarketingName = "普通活動2" });
 
             //事件活動
             if (!dic.ContainsKey(2))
                 dic[2] = new List<Marketing>();
             dic[2].Add(new Marketing() { MarketingID = 3, MarketingName = "事件活動1" });
             dic[2].Add(new Marketing() { MarketingID = 4, 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視頻教程 【一包煙的錢哦

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved