LINQ实现多次调用GroupBy进行分组统计

在回答论坛上的 linq 分组求和的疑问   http://bbs.youkuaiyun.com/topics/390832024  而写的,特此记录下来,直接上代码

  private void button2_Click(object sender, EventArgs e)
		  {
			   List<Test> listTest = new List<Test>() 
			   {
					new Test{ Ming="A", Xingbie="N",Xuehao="BL1",Code="AFR",zhi=13},
					new Test{ Ming="A", Xingbie="N",Xuehao="BL1",Code="AFR",zhi=47},
					new Test{ Ming="A", Xingbie="N",Xuehao="BL1",Code="WSR",zhi=13},
					new Test{ Ming="A", Xingbie="N",Xuehao="BL1",Code="WSR",zhi=57},
					new Test{ Ming="A", Xingbie="N",Xuehao="BL2",Code="AFR",zhi=13},
					new Test{ Ming="O", Xingbie="Y",Xuehao="BL2",Code="AFR",zhi=13},
			   };
			   //方法1,最好
			   var result1 = listTest.GroupBy(x => new { x.Ming, x.Xingbie, x.Xuehao }).
SelectMany(x => x.GroupBy(a => a.Code)).Select(xx => new
			   {
					zhi = xx.Sum(z => z.zhi),
					xx.First().Ming,
					xx.First().Xingbie,
					xx.First().Xuehao,
					xx.First().Code
			   }).ToList();
			   //方法2,其次
			   var result2 = listTest.GroupBy(x => x.Code, (Code, ItemGroup) => new
			   {
					GetResult = ItemGroup.GroupBy(s => new { s.Ming, s.Xingbie, s.Xuehao },
				   (Item, resultGroup) => new
				   {
						Item.Ming,
						Item.Xingbie,
						Item.Xuehao,
						Code,
						zhi = resultGroup.Sum(o => o.zhi)
				   })
			   }).ToList();
			   foreach (var item in result2)
			   {
					foreach(var item1 in item.GetResult)
					{
						 MessageBox.Show(item1.ToString());
					}
			   }
			   //方法3,最次
			   var result3 = listTest.GroupBy(
				   s => new { s.Ming, s.Xingbie, s.Xuehao },
				   (Item, ItemGroup) => new
				   {
						GetResult =
							ItemGroup.GroupBy(
								s2 => s2.Code,
								(Code, GetResult) => new
								{
									 Item.Ming,
									 Item.Xingbie,
									 Item.Xuehao,
									 Code,
									 zhi = GetResult.Sum(o => o.zhi)
								}
							)
				   }
			   ).ToList();

			   
		  }

		  public class Test
		  {
			   public string Ming { get; set; }
			   public string Xingbie { get; set; }
			   public string Xuehao { get; set; }
			   public string Code { get; set; }
			   public int zhi { get; set; }
		  }

输出结果:

  Ming="A", Xingbie="N",Xuehao="BL1",Code="AFR",zhi=60,
  Ming="A", Xingbie="N",Xuehao="BL1",Code="WSR",zhi=70,
  Ming="A", Xingbie="N",Xuehao="BL2",Code="AFR",zhi=13,
  Ming="O", Xingbie="Y",Xuehao="BL2",Code="AFR",zhi=13,





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值