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

大功告成

下载代码

时间: 2024-11-12 11:18:54

Linq基于两个属性的分组的相关文章

java List按照对象的属性进行分组

一.问题背景 在java的开发过程中,我们往往也需要用对象进行分组进行处理,如何对List进行分组呢?以下我们简单高效的实现分组 二.问题解决 1 //以下WarehouseDeliveryTimeVO的列表中对其属性logisticsModel(物流模式)进行分组,new String[]{}可以按照多个属性进行分组,allTimeVO为其对象列表 2 Map<String,List<WarehouseDeliveryTimeVO>> logisticsModelGoodsMap

ListBox之类控件的Item项显示对象的两个属性

wpf项目中,ListBox绑定对象集合,ListBoxItem要显示对象的两个属性,例如:显示员工的工号和姓名. 之前我的做法是在Employee员工类中添加一个"NumAndName",属性,给员工对象的工号属性赋值.姓名属性赋值时,同时给“NumAndName”属性 赋值为“工号”+“姓名”两个属性拼接的字符串,ListBox绑定员工的集合,ListBox的Item绑定"NumAndName"属性,这样就同时显示了工号和姓名. 今天,发现了一个简单的方法,即:

Test注解的两个属性(转)

Test注解的两个属性:expected和timeout Junit的Test注解支持两个可选的参数expected和timeout.expected声明一个测试方法必须抛出一个异常.如果不抛出异常或抛出和expectd指定的异常类型不同的异常,则测试用例就会失败. 如下面这个测试用例就会通过: @Test(expected=IndexOutOfBoundsException.class) public void outOfBounds() { new ArrayList<Object>().

timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP

timestamp有两个属性,分别是CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1. CURRENT_TIMESTAMP 当要向数据库执行insert操作时,如果有个timestamp字段属性设为 CURRENT_TIMESTAMP,则无论这个字段有没有set值都插入当前系统时间 2. ON UPDATE CURRENT_TIMESTAMP 当执行update操作是,并且字段有ON UPDATE CURRENT_TIME

C语言中数据的两种属性及static的作用

C语言中数据有两种属性:数据类型和存储类别.数据类型定义了数据格式(长度),存储类别定义了数据的作用域和生命期. 1.变量的声明 1.1 变量的声明的一般形式:存储类别 数据类型 变量名;数据类型以int为例: 自动变量:auto int i;//自动变量是局部变量 局部变量:在函数内部定义的变量,局部变量缺省存储类别时就是自动变量 作用域:从定义开始到函数结束. 生命期:从函数调用开始到函数推出为止. 外部变量/全局变量:在函数外部定义而没有指出存储类别的变量 定义外部变量:extern in

基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转

基于css3新属性transform,实现3d立方体的旋转 通过原生JS,点击事件,鼠标按下.鼠标抬起和鼠标移动事件,实现3d立方体的拖动旋转,并将旋转角度实时的反应至界面上显示 实现原理:通过获取鼠标点击屏幕时的坐标和鼠标移动时的坐标,来获得鼠标在X轴.Y轴移动的距离,将距离实时赋值给transform属性 从而通过改变transform:rotate属性值来达到3d立方体旋转的效果 HTML代码块: <body> <input type="button" clas

定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl

因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式. 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Complex C1,Complex C2) 求两个复数的差的方法:(参数

Java集合框架上机练习题:编写一个Book类,该类至少有name和price两个属性。该类要实现Comparable接口,在接口的compareTo()方法.....

编写一个Book类,该类至少有name和price两个属性.该类要实现Comparable接口,在接口的compareTo()方法中规定两个Book类实例的大小关系为二者的price属性的大小关系.在主函数中,选择合适的集合类型存放Book类的若干个对象,然后创建一个新的Book类的对象,并检查该对象与集合中的哪些对象相等. package javajihe; public class Book implements Comparable{ String name; float price; B

实现对List里面的对象元素,以某个属性来分组

实现对List里面的对象元素,以某个属性来分组. 代码实现: import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class ListGroupTest { static List<User> us