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,进行检索。
大功告成
漫思