首页 > 代码库 > Linq基于两个属性的分组

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,进行检索。

大功告成

下载代码

 

Linq基于两个属性的分组