读书笔记 C# Linq查询之group关键字浅析

在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);
   }      
}
原文地址:https://www.cnblogs.com/williamwsj/p/6098592.html