linq 分组求和的疑问

xiaozhang1528008 2014-07-10 04:15:44
如题,比如一个对象是
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},
};

我想先根据前面3个字段分组,这样得到的list有3个小项。
然后再在3个小项中根据第4个字段Code来分组,求出zhi的和,最终想得到的是

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,

我这样写会有问题
var result = listTest .GroupBy(x => new { x.Ming, x.Xingbie, x.Xuehao}).Select(g => new { zhiSum = g.Sum(x => x.zhi), g.Key.Ming, g.Key.Xingbie, g.Key.Xuehao});
...全文
214 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
蝶恋花雨 2014-07-11
  • 打赏
  • 举报
回复
  var result = 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();
这种写法也行 list直接得到想要的结果
游离失所 2014-07-10
  • 打赏
  • 举报
回复
引用 3 楼 xiaozhang1528008 的回复:
[quote=引用 2 楼 lyj224170707 的回复:] var a = listTest.GroupBy(x => x.Ming + x.Xingbie + x.Xuehao).SelectMany(x => x.GroupBy(y => y.Code)); 这样简单点
谢谢你的回答,还是不行,我要的是分组求和,没有办法取到对象是这样的 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, [/quote]

 var a = listTest.GroupBy(x => x.Ming + x.Xingbie + x.Xuehao).ToList().SelectMany(x => x.GroupBy(y => y.Code)).Select(x =>
            {
                var temp = x.First();
                temp.zhi = x.Sum(z => z.zhi);
                return temp;
            });

            foreach (var temp in a)
            {
                Response.Write(temp.Ming + "/" + temp.Xingbie + "/" + temp.Xuehao + "/" + temp.Code + "/" + temp.zhi + "<br/>");
            }
结果

A/N/BL1/AFR/60
A/N/BL1/WSR/70
A/N/BL2/AFR/13
O/Y/BL2/AFR/13

你改下不就出来了。。思路都一样。。就后面加了个select 你真很不熟linq
xiaozhang1528008 2014-07-10
  • 打赏
  • 举报
回复
引用 2 楼 lyj224170707 的回复:
var a = listTest.GroupBy(x => x.Ming + x.Xingbie + x.Xuehao).SelectMany(x => x.GroupBy(y => y.Code)); 这样简单点
谢谢你的回答,还是不行,我要的是分组求和,没有办法取到对象是这样的 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,
游离失所 2014-07-10
  • 打赏
  • 举报
回复
var a = listTest.GroupBy(x => x.Ming + x.Xingbie + x.Xuehao).SelectMany(x => x.GroupBy(y => y.Code)); 这样简单点
游离失所 2014-07-10
  • 打赏
  • 举报
回复
var a = listTest.GroupBy(x => x.Ming + x.Xingbie + x.Xuehao).ToList().SelectMany(x => x.GroupBy(y => y.Code)).ToList();

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧