• LINQ技巧:如何通过多次调用GroupBy实现分组嵌套


    using System;
    using System.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public class S
            {
                public int Year;
                public int Month;
                public int Day;
            }
            
            static void Main(string[] args)
            {
                var m = new []{
                    new S{Year = 2000, Month = 1, Day = 10},
                    new S{Year = 2000, Month = 2, Day = 10},
                    new S{Year = 2010, Month = 1, Day = 1},
                    new S{Year = 2010, Month = 2, Day = 1},
                    new S{Year = 2010, Month = 1, Day = 2},
                    new S{Year = 2010, Month = 2, Day = 2},
                    new S{Year = 2000, Month = 1, Day = 2},
                    new S{Year = 2000, Month = 2, Day = 2},
                };
    
                var q2 =
                    from s in m
                    group s by s.Year into YearGroup
                    select new
                    {
                        Year = YearGroup.Key,
                        MonthGroups =
                            from s2 in YearGroup
                            group s2 by s2.Month into MonthGroup
                            select new
                            {
                                Month = MonthGroup.Key,
                                Days =
                                    from s3 in MonthGroup
                                    orderby s3.Day
                                    select s3.Day
                            }
                    };
    
    
                var q = m.GroupBy(
                        s => s.Year,
                        (Year, YearGroup) => new
                        {
                            Year,
                            MonthGroups =
                                YearGroup.GroupBy(
                                    s2 => s2.Month,
                                    (Month, MonthGroup) => new
                                    {
                                        Month,
                                        Days = MonthGroup.OrderBy(s3 => s3.Day).Select(s3 => s3.Day)
                                    }
                                )
                        }
                    );
    
                foreach (var elem in q)
                //foreach (var elem in q2)
                {
                    Console.WriteLine("Year = {0}", elem.Year);
                    foreach (var elem2 in elem.MonthGroups)
                    {
                        Console.WriteLine("	Month = {0}", elem2.Month);
                        foreach (var day in elem2.Days)
                            Console.WriteLine("		Day = {0}", day);
                    }
                }
            }
        }
    }
    //Year = 2000
    //        Month = 1
    //                Day = 2
    //                Day = 10
    //        Month = 2
    //                Day = 2
    //                Day = 10
    //Year = 2010
    //        Month = 1
    //                Day = 1
    //                Day = 2
    //        Month = 2
    //                Day = 1
    //                Day = 2
  • 相关阅读:
    gym-102307 D. Do Not Try This Problem
    AtCoder Beginner Contest 161 E
    Codeforces 1270E 构造+数学
    2019牛客暑期多校训练营(第七场)E 线段树+离散化区间
    codeforces 1272F dp+记录路径
    Focus相关点滴
    Command模式
    接口隔离原则(ISP)
    依赖倒置原则(DIP)
    Liskov替换原则(LSP)
  • 原文地址:https://www.cnblogs.com/sjqq/p/6899319.html
Copyright © 2020-2023  润新知