两种LINQ分组查询写法结果不同,请问问题出在哪里?
问题分析与解决
嗨,咱们来看看你的问题出在哪!你的核心问题是两种LINQ写法的逻辑差异,我给你拆解清楚:
为什么第一种查询表达式能正确排序分组?
你最初的查询表达式:
var s = from student in students group student by student.Year into studentGroup orderby studentGroup.Key select studentGroup;
这里的orderby studentGroup.Key是对所有分组的集合进行排序——也就是把每个年级对应的分组,按照年级(Key)的顺序排列,所以最终输出的分组是按FirstYear、SecondYear...这样的正确顺序来的。
你的链式写法错在哪?
你后来写的链式代码:
var s = students .GroupBy(x => x.Year) .Select(group => group.OrderBy(record => record.Year));
这里的OrderBy(record => record.Year)是对每个分组内部的学生进行排序,但完全没处理「分组本身的顺序」。GroupBy默认会按照元素首次出现的顺序返回分组,所以你看到的结果是分组乱序的,只是每个组里的学生是按年级排的(不过本来同组学生年级就一样,这步其实没什么实际作用😂)。
正确的链式写法
如果你想要和查询表达式完全一致的效果(分组按年级排序,组内不需要额外排序),应该对分组集合按Key排序,而不是组内元素:
var s = students .GroupBy(x => x.Year) .OrderBy(group => group.Key);
如果同时需要组内也排序(比如同年级学生按姓名排序,按Year排序没意义),就先排分组,再处理组内:
var s = students .GroupBy(x => x.Year) .OrderBy(group => group.Key) .Select(group => group.OrderBy(record => record.Name));
这样就能得到和查询表达式一样的分组顺序啦!
内容的提问来源于stack exchange,提问作者user4940368
相关产品推荐
相关产品推荐

