[Entity Framework與LINQ開發實戰] GroupBy的使用心得
在操作集合物件的時候,常常會用到群組的功能。
但剛開始用時,常會覺得使用 GroupBy方法後,所回傳的型別IEnumerable<IGrouping<TKey,TElement>>
不知道該如何操作他。不過用久了也有一點小心得,今天當作一篇筆記分享一下。
MSDN - IGrouping<TKey, TElement> 介面
類似這麼一份全台的鄉鎮縣市資料:
我希望以縣市當成 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);
}
}
結果如下:
如果還是不習慣的話,可以再更進一步轉成較熟悉的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就是此縣市下的鄉鎮市區集合囉。