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

大功告成

下载代码

 

posted on 2016-09-19 21:25  漫思  阅读(2192)  评论(0编辑  收藏  举报

导航