Linq查询中的顺序子分组
本文关键字:顺序 查询 Linq | 更新日期: 2023-09-27 18:17:37
我有一个问题与Linq查询。我有一个格式如下的查询,它返回一个按顶级级别分组的结果集,并按顶级字符串的字母顺序排序。我想返回一个结果集,该结果集由顶级字符串(因此group by子句按字母顺序排序)和子级字符串也按字母顺序排序(因此每个子组也是按字母顺序排序)。我所期望的是如下内容:
- 一
- B C
- B
- B C
我的查询如下:
records.results
.Where(table => string.Compare(table, expected) == 0)
.OrderByDescending(table => table.name)
.GroupBy(table => table.name);
.OrderBy(group => group.Key);
我期望orderbydescent语句改变groupby子句中单个记录的顺序,但它没有影响任何东西。不过,我正在收到分组的有序结果。任何帮助都是感激的!
您的问题是您的最终OrderBy
语句正在对组本身进行排序。你要做的是给每组元素排序。试一试:
records.results
.Where(table => string.Compare(table, expected) == 0)
.OrderByDescending(table => table.name)
.GroupBy(table => table.name);
.Select(g => g.OrderByDescending(element => element.Name);
我不确定你想要排序的属性是什么,但这里我假设它是Name
。
这里的关键是要记住IGrouping
本身就是IEnumerable
。请参阅这里的IGrouping
文档,并注意它实现了IEnumerable
,因此我们可以在IGroupings
的IEnumerable
中的每个组上调用OrderByDescending
,这是Enumerable.GroupBy
的返回类型(这里有文档)。
由于OrderByDescending
将返回IEnumerable
(而不是IGrouping
),该操作将失去每个组的Key
属性。如果您需要这样做,那么您可能希望简单地选择一个匿名类型来保存密钥。将最终的Select
替换为:
.Select(g => new { g.Key, elements = g.OrderByDescending(element => element.Name) });
或者,您可以按照这里的说明编写一些逻辑,在这里实例化IGrouping
。