在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); } }