编程技巧:使用LINQ如何通过多次调用GroupBy实现分组嵌套
来源:互联网 发布:淘宝童装名片设计 编辑:程序博客网 时间:2024/05/16 05:41
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("\tMonth = {0}", elem2.Month); foreach (var day in elem2.Days) Console.WriteLine("\t\tDay = {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