LINQ技巧:如何通过多次调用GroupBy实现分组嵌套
2016-05-25 21:09
369 查看
问题如上,解决如下,目标在最下面:结果:
using System; using System.Linq; using System.Collections.Generic; namespace ConsoleApplication1 { class Program { public class Sdata { public string gather; public int shotcount; } static void Main(string[] args) { var m = new[]{ new Sdata{gather = "100002",shotcount = 28}, new Sdata{gather = "100002", shotcount =44}, new Sdata{gather = "100003", shotcount = 8}, new Sdata{gather = "100003", shotcount = 20}, new Sdata{gather = "100004", shotcount = 55}, new Sdata{gather = "100004", shotcount = 60}, new Sdata{gather = "100005", shotcount = 10}, new Sdata{gather = "100005", shotcount = 60}, new Sdata{gather = "100006", shotcount = 24}, new Sdata{gather = "100006", shotcount = 75}, new Sdata{gather = "100010", shotcount = 41}, new Sdata{gather = "100010", shotcount = 81}, new Sdata{gather = "100012", shotcount = 75}, new Sdata{gather = "100012", shotcount = 100}, }; var q2 = from s in m group s by s.gather into gatherGroup select new { gather = gatherGroup.Key, shotcountGroups = from s2 in gatherGroup group s2 by s2.shotcount into shotcountGroups select new { shotcount = shotcountGroups.Key, //Days = // from s3 in shotcountGroups // orderby s3.Day // select s3.Day } }; foreach(var item in q2) { Console.WriteLine("1gather={0}",item.gather); foreach(var itme2 in item.shotcountGroups) { Console.WriteLine("\tshotcount = {0}",itme2.shotcount); } } var q = m.GroupBy( s => s.gather, (gather, gatherGroup) => new { gather, shotcountGroups = gatherGroup.GroupBy( s2 => s2.shotcount, (shotcount, shotcountGroups) => new { shotcount, //Days = shotcountGroups.OrderBy(s3 => s3.Day).Select(s3 => s3.Day) } ) } ); List<object> listobj = new List<object>(); List<object> obj = new List<object>(); foreach (var elem in q) //foreach (var elem in q2) { int tc = elem.shotcountGroups.Count(); var d=new List<object>() ; Console.WriteLine("2gather = {0}", elem.gather); d.Add(elem.gather); foreach (var elem2 in elem.shotcountGroups) { Console.WriteLine("\tshotcount = {0}", elem2.shotcount); //foreach (var day in elem2.Days) // Console.WriteLine("\t\tDay = {0}", day); d.Add(elem2.shotcount); } Console.WriteLine("eachobj is {0}",d.Count()); listobj.Add(d); } Console.WriteLine("listobj is {0}", listobj.Count); foreach (var mdata in listobj) { Console.WriteLine("listobj is {0}", listobj.ToList()); } Console.Read(); } } }
gather = 100002
shotcount = 28
shotcount = 44
gather = 100003
shotcount = 8
shotcount = 20
gather = 100004
shotcount = 55
shotcount = 60
gather = 100005
shotcount = 10
shotcount = 60
gather = 100006
shotcount = 24
shotcount = 75
gather = 100010
shotcount = 41
shotcount = 81
gather = 100012
shotcount = 75
shotcount = 100
相关文章推荐
- 构建之法
- poj 3666 Making the Grade
- Android MVP 设计模式
- 【POJ1276】Cash Machine(多重背包单调队列优化)
- shell终端中断前台进程
- linux进程管理
- linux进程管理
- Python3 函数
- 【转】spring源码解析
- 动态规划12之1017
- linux进程管理
- poj 3087
- 数据挖掘导论 (二)
- Jessica's Reading Problem
- git 简明指南---使用教程
- listview 点击错乱
- redis - Java操作
- 高精度对数函数的实现二
- Android在xml中设置点击事件不响应
- 第13周实践项目2动物这样叫(2)