C#-Group By 的使用

简介: group by 是linq中的分组功能,能通过给定的字段对数据集进行分组,得到分组后的结果。

group by 是linq中的分组功能,能通过给定的字段对数据集进行分组,得到分组后的结果。

基本用法

使用扩展函数GroupBy对数据集合通过给定的字段进行分组,新建一个基于.net6的控制台项目,在program.cs中写如下代码,通过班级将学生进行分组展示(顶级语句 ,从 C# 9 开始,无需在控制台应用程序项目中显式包含 Main 方法。 相反,可以使用顶级语句功能最大程度地减少必须编写的代码。 在这种情况下,编译器将为应用程序生成类和 Main 方法入口点。):

// See https://aka.ms/new-console-template for more information
List<Student> students = new List<Student>() {
    new Student(){Name="1",Classroom="a"},
    new Student(){Name="2",Classroom="a"},
    new Student(){Name="3",Classroom="b"},
    new Student(){Name="4",Classroom="b"}
};
var groupStudents=students.GroupBy(student=>student.Classroom);
foreach(var groupStudent in groupStudents)
{
    Console.WriteLine(groupStudent.Key);
    foreach(var student in groupStudent)
    {
        Console.WriteLine($"{student.Name},{student.Classroom}");
    }
}
public class Student
{
    public string Name { get; set; }
    public string Classroom { get; set; }
}

分组求和

统计某同学的总分,参考代码:

// See https://aka.ms/new-console-template for more information
List<Student> students = new List<Student>() {
    new Student(){Name="小明",Classroom="a班",Subjects="数学",Score=100},
    new Student(){Name="小彭",Classroom="a班",Subjects="数学",Score=100},
    new Student(){Name="小明",Classroom="a班",Subjects="语文",Score=90},
    new Student(){Name="小黄",Classroom="b班",Subjects="语文",Score=90}
};
var groupStudents = from student in students
                    group student by new { student.Name, student.Classroom }
                    into res
                    select new Student
                    {
                        Name = res.First().Name,
                        Classroom = res.First().Classroom,
                        Subjects = "已考科目总分",
                        Score = res.Sum(x => x.Score),
                    };
foreach (var groupStudent in groupStudents)
{
    Console.WriteLine($"{groupStudent.Name},{groupStudent.Classroom},{groupStudent.Subjects},{groupStudent.Score}");
}
public class Student
{
    /// <summary>
    /// 姓名
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 班级
    /// </summary>
    public string Classroom { get; set; }
    /// <summary>
    /// 科目
    /// </summary>
    public string Subjects { get; set; }
    /// <summary>
    /// 分数
    /// </summary>
    public float Score { get; set; }
}

目录
相关文章
|
9月前
|
开发框架 .NET C#
ASP.Net c# 正则表达式 子表达式 group
ASP.Net c# 正则表达式 子表达式 group
53 0
|
3月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---group和join相关用法(三)
C#学习相关系列之Linq用法---group和join相关用法(三)
127 1
|
3月前
|
SQL 开发框架 .NET
C#进阶-LINQ表达式之GroupBy分组查询
本篇文章我们将演示LINQ扩展包基础语法里的GroupBy分组查询,并实现投影等实际操作中常用的类型转换手法。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
154 0
|
存储 .NET C#
C# LINQ 详解 From Where Select Group Into OrderBy Let Join
目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述     LINQ的全称是Language Integrated Query,中文译成“语言集成查询”。
2043 0
|
3月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
150 3
|
3月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
162 3
|
15天前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
39 7
|
1天前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
5 0