[Entity Framework與LINQ開發實戰] GroupBy的使用心得

[Entity Framework與LINQ開發實戰] GroupBy的使用心得

在操作集合物件的時候,常常會用到群組的功能。

但剛開始用時,常會覺得使用 GroupBy方法後,所回傳的型別IEnumerable<IGrouping<TKey,TElement>>

不知道該如何操作他。不過用久了也有一點小心得,今天當作一篇筆記分享一下。

 

MSDN  -  IGrouping<TKey, TElement> 介面

 

類似這麼一份全台的鄉鎮縣市資料:

image

我希望以縣市當成 key 來GroupBy這份資料。這時候會這麼下:


	MyDBDataContext db = new MyDBDataContext();

IQueryable<IGrouping<string, string>> model = db.郵遞區號.GroupBy(p => p.縣市,
                                                                 p => p.鄉鎮市區);

 

 

這時候的資料會被整理成多組 IGrouping<TKey,TElement>,而這個型別是代表擁有

一個相同鍵值的物件集合。因此除了多了個Key,其餘的部分可以當成一般集合來看。


	foreach (var item in model)
{
      //key值是以GroupBy的第一個參數為依據。
      //以本例來說,就是縣市。
      Console.WriteLine("=================="+item.Key+"====================");

      //除了多了個key值之外,其餘的部分就可以當作是一個集合來使用。
      //集合內是什麼由GroupBy的第二個參數來決定。
      //以本例來說,就是鄉鎮市區。代表這個key(縣市)之下的所有Element(鄉鎮市區)
      foreach (var area in item)
      {
          Console.WriteLine(area);
      }
}

結果如下:

image

如果還是不習慣的話,可以再更進一步轉成較熟悉的Dictionary型別


	//ToDictionary的第一個參數是key,就拿前一步GroupBy過的key來用
//第二個參數是Value,因為我不要IGrouping型別了,因此只Select出IGrouping的Element。
Dictionary<string, List<string>> model = 
                db.郵遞區號.GroupBy(p => p.縣市,p=>p.鄉鎮市區)
                          .ToDictionary(p=>p.Key,p=>p.Select(s=>s).ToList());

 

轉完之後,Dictionary的Key就是縣市,Value就是此縣市下的鄉鎮市區集合囉。