LINQ查询表达式---------group子句

LINQ查询表达式---------group子句

LINQ表达式必须以from子句开头,以select或group子句结束。使用guoup子句来返回元素分组后的结果。group 子句返回一个 IGrouping<TKey, TElement> 对象序列(实质上是列表的列表)。TKey是键的对象类型,在用于group子句的时候,它一般用于存储分组的键值;TElement是指的对象类型,用于存储分组的结果。
class Program
{
    public class PerInfo
    {
        public int Id
        {
            get;
            set;
        }
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
    }

    static void Main(string[] args)
    {
        List<PerInfo> perInfos = new List<PerInfo>
        {
            new PerInfo{Id = 1, Name = "小日", Age = 15},
            new PerInfo{Id = 2, Name = "小日月", Age = 17},
            new PerInfo{Id = 3, Name = "张三四", Age = 21},
            new PerInfo{Id = 4, Name = "李四五六七", Age = 23}
        };

        //使用布尔值作为键将结果划分成两个组
        //以‘17’为界限进行分组,大于等于17的一组,小于17的一组
        var booleanQuery1 = from p in perInfos
                            group p by p.Age >= 17;

        Console.WriteLine("Query1:");
        foreach (var key in booleanQuery1)
        {
            Console.WriteLine("  分组键{0},{1}", key.Key, key.Key == true ? "Age大于等于17" : "Age小于17");
            foreach (var item in key)
            {
                Console.WriteLine("    {0}  {1}", item.Name, item.Age);
            }
        }

        //使用字符串作为键将结果划分为两个组
        //Name第一个字相同的为一组
        var booleanQuery2 = from p in perInfos
                            group p by p.Name[0];

        Console.WriteLine("\nQuery2:");
        foreach (var key in booleanQuery2)
        {
            Console.WriteLine("  分组键{0}", key.Key);
            foreach (var item in key)
            {
                Console.WriteLine("    {0}  {1}", item.Name, item.Age);
            }
        }


        //group by into
        //into 关键字来启用临时标识符
        var booleanQuery3 = from p in perInfos
                            let lenName = p.Name.Length //let子句用来保存表达式的结果
                            where lenName > 2 //只筛选出名字长度大于2的
                            group p by lenName into g//使用 into 关键字来启用临时标识符 g,该标识符具有推断类型 IGroupi
                            where g.Count() > 1 //筛选出每组数量大于1 的组
                            select g;
        Console.WriteLine("\nQuery3:");
        foreach (var key in booleanQuery3)
        {
            Console.WriteLine("  分组键{0}", key.Key); //这里的分组键是名字的长度
            foreach (var item in key)
            {
                Console.WriteLine("    {0}  {1}", item.Name, item.Age);
            }
        }

        Console.ReadLine();
    }
}
输出结果:
Query1:
  分组键False,Age小于17
    小日  15
  分组键True,Age大于等于17
    小日月  17
    张三四  21
    李四五六七  23

Query2:
  分组键小
    小日  15
    小日月  17
  分组键张
    张三四  21
  分组键李
    李四五六七  23

Query3:
  分组键3
    小日月  17
    张三四  21

  

posted @ 2017-03-03 16:45  涂山吕吕  阅读(357)  评论(0编辑  收藏  举报