在C#中,自從有了Linq查詢表達式后,程序員對可被迭代的序列或列表執行一系列的篩選、排序、過濾、分組、查詢等操作。本文章所要講述的是group關鍵字。
Linq查詢表達式,是以from關鍵字開頭,以select或group關鍵字結尾,它們之中可以插入where、orderby、join、let甚至附加的from子句。
group子句返回的是一個IGrouping<TKey,TElement>對象序列,請注意,是對象序列,而不是單個對象。由於group查詢產生的IGrouping<TKey,TElement>實質上是列表的列表。因此必須使用嵌套的foreach循環來訪問每一組的各個子項。外部循環可以訪問每個組的Key,內部循環可以訪問每個組的子項。
每個組的Key可以是任何類型,如字符串、用戶自定義的對象或其他。
可以用如下代碼來對序列進行分組:
//不排序的直接分組
var cityGroup = from city in cities group city by city.Name;
//通過每組的Key排序的分組 var cityGroup = from city in cities //先通過每個城市的名稱來分組,每組的子項就是group關鍵字后面的city對象實例 group city by city.Name //接着將該組賦給一個變量g into g //然后就可以通過g的Key去排序,g.Key就是by關鍵字后面的那個參數,即city.Name orderby g.Key //最后選中該組 select g
//自定義group的每個子項 var cityGroup = from city in cities
//注意,by關鍵字后面的參數 一定要和 group關鍵字后面的參數 有一定的關聯,否則無法進行分組 group new{city.Name,city.PeopleCount,SomeParam="自定義"} by city.Name
可以用嵌套的foreach循環來獲取每個子項。每個子項其實就是group關鍵字后面的對象,如city。
foreach(var theCities in cityGroup){ //首先獲取每個組的Key,在分組時,by后面的那個參數city.Name Console.WriteLine("每個組的Key:{0}",theCities.Key); //接着再次循環,獲取每個組的子項,即group后面的那個參數city對象 foreach(var city in theCities){ Console.WriteLine("城市名稱:{0}",city.Name); Console.WriteLine("總人數:{0}",city.PeopleCount); } }