我遇到了Linq查询的问题。我有一个格式如下的查询,它返回一个按顶级分组的结果集,并按字母顺序排列顶级字符串。我想返回由顶级字符串排序的结果集(因此group by子句按字母顺序排序),子级别字符串也按字母顺序排列(因此每个子组也按字母顺序排列)。我期待的是以下内容:
我的查询类似于以下内容:
records.results
.Where(table => string.Compare(table, expected) == 0)
.OrderByDescending(table => table.name)
.GroupBy(table => table.name);
.OrderBy(group => group.Key);
我希望OrderByDescending语句改变groupby子句中各个记录的顺序,但它不会产生任何影响。我收到了团体的有序结果。任何帮助表示赞赏!
答案 0 :(得分:2)
您的问题是您的最终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
here的文档,并注意它实现了IEnumerable
,因此我们可以在OrderByDescending
IEnumerable
中的每个群组上致电IGroupings
,这是Enumerable.GroupBy
的返回类型(记录为here)。
由于OrderByDescending
将返回IEnumerable
(而不是IGrouping
),此操作将失去每个组的Key
属性。如果您需要,那么您可能只想选择一个匿名类型来保留密钥。将最终Select
替换为:
.Select(g => new { g.Key, elements = g.OrderByDescending(element => element.Name) });
或者,您可以按照here的指示编写一些逻辑,以便在此处IGrouping
实例化。