zoukankan      html  css  js  c++  java
  • LINQ技巧:如何通过多次调用GroupBy实现分组嵌套

    问题如上,解决如下,目标在最下面:结果: 

    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("	shotcount = {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("	shotcount = {0}", elem2.shotcount);
                        //foreach (var day in elem2.Days)
                        //    Console.WriteLine("		Day = {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

  • 相关阅读:
    《大话数据结构》第9章 排序 9.9 快速排序(下)
    [HTML5 DOM] dispatchEvent
    [AWS SAP] Exam Tips 2 Continues Improvement for Existing Solutions
    遇见C++ PPL:C++ 的并行和异步
    遇见C++ AMP:在GPU上做并行计算
    遇见C++ Lambda
    遇见C++ AMP:GPU的线程模型和内存模型
    服务器推技术
    转http状态码
    extjs同步与异步请求互换
  • 原文地址:https://www.cnblogs.com/qiri07/p/5528506.html
Copyright © 2011-2022 走看看