LINQ学习(六):OrderBy/Group By子句
测试数据:
class Student { public string Name { get; set; } public int Score { get; set; } } List<Student> students = new List<Student>{ new Student {Name="Terry", Score=50}, new Student {Name="Tom", Score=85}, new Student {Name="Wade", Score=90}, new Student {Name="James", Score=70}, new Student {Name="Kobe", Score=90}, new Student {Name="AK", Score=90}, };
1.OrderBy
说明:在查询表达式中,orderby子句可对集合按升序(ascending)或降序(descending)排序(默认的是升序)。可以指定多个排序的值,以便执行一个或多个次要排序操作。
对分数进行降序排序,然后再将分数相同的学生姓名进行升序排列(分数为主要排序,姓名为次要排序):
var query = from student in students orderby student.Score descending, student.Name select student; foreach (var student in query) { Console.WriteLine("{0}:{1}", student.Name, student.Score); //AK:90 //Kobe:90 //Wade:90 //Tom:85 //James:70 //Terry:50 }
2.Group By
(1)说明:group子句返回一个 IGrouping<TKey, TElement> 对象序列,这些对象包含零个或更多个与该组的键值匹配的项。 例如,可以按照每个字符串中的第一个字母对字符串序列进行分组。 在这种情况下,第一个字母是键且具有 char 类型,并且存储在每个 IGrouping<TKey, TElement> 对象的Key属性中。
按照学生分数分组:
var query = from student in students group student by student.Score; foreach (var studentGroup in query) { //studentGroup推断为IGrouping<int,Student>类型 Console.WriteLine("{0}", studentGroup.Key); //50 //85 //90 //70 }
(2)说明:由于 group 查询产生的 IGrouping<TKey, TElement> 对象实质上是列表的列表,因此必须使用嵌套的 foreach 循环来访问每一组中的各个项。 外部循环用于循环访问组键,内部循环用于循环访问组本身中的每个项。组可能具有键,但没有元素。如果您想要对每个组执行附加查询操作,则可以使用 into 上下文关键字指定一个临时标识符。 使用 into 时,必须继续编写该查询,并最终用一个 select 语句或另一个 group 子句结束该查询。
查询每个分数组中的每个学生的信息:
var query = from student in students group student by student.Score into g select g; foreach (var studentGroup in query) { Console.WriteLine("分数组:{0}", studentGroup.Key); foreach (var student in studentGroup) { Console.Write("{0}:{1},", student.Name,student.Score); } Console.WriteLine(); //分组:50 //Terry:50, //分组:85 //Tom:85, //分组:90 //Wade:90,Kobe:90,AK:90, //分组:70 //James:70, }
(3)同样的,group 子句可按照任何类型进行分组,如字符串、内置数值类型、用户定义的命名类型或匿名类型。形式差不多,有需要可查阅其他资料
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述