
正文
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="", Name="马良", Subject="数学", Score=},
new Student{ ID="", Name="马良", Subject="语文",Score=},
new Student{ ID="", Name="马良", Subject="物理", Score=},
new Student{ ID="", Name="马青", Subject="数学", Score=},
new Student{ ID="", Name="马青", Subject="语文",Score=},
new Student{ ID="", Name="马青", Subject="物理", Score=},
};
将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,进行检索。
大功告成
下载代码






