您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: