Linq基于两个属性的分组
1、需求
我们看下面的定义
#region 学生类 /// <summary> /// 学生类 /// </summary> class Student { /// <summary> /// ID /// </summary> public string ID { get; set; } /// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 分数 /// </summary> public float Score { get; set; } /// <summary> /// 科目 /// </summary> public string Subject { get; set; } } #endregion
我们实例化一组数据
//实例化一组数据 List<Student> list = new List<Student>() { new Student{ ID="00000001", Name="马良", Subject="数学", Score=100}, new Student{ ID="00000001", Name="马良", Subject="语文",Score=99}, new Student{ ID="00000001", Name="马良", Subject="物理", Score=95}, new Student{ ID="00000003", Name="马青", Subject="数学", Score=100}, new Student{ ID="00000003", Name="马青", Subject="语文",Score=80}, new Student{ ID="00000003", Name="马青", Subject="物理", Score=95}, };
将list按照ID和name分组,并求分数的和。
2、解决方案
通常的解决解决方案时排序两次,先用id排一次,再用Name排一次。
今天我们采用一种新的方式。采用匿名对象来存储id,name的对象。具体实现方案如下
//按照两个字段进行分组 var group = from item in list group item by new { item.ID, item.Name } into caca select new { key = caca.Key, sum = caca.Sum(it => it.Score) }; //将分组数据打印出来 foreach (var item in group) { Console.WriteLine("{0},{1}->{2}", item.key.ID, item.key.Name, item.sum); } Console.ReadKey();
解读上面的代码,将new { item.ID, item.Name }设定为key,进行检索。
大功告成
漫思
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器