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子句中单个记录的顺序,但它没有影响任何东西。不过,我正在收到分组的有序结果。任何帮助都是感激的!

Linq查询中的顺序子分组

您的问题是您的最终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,因此我们可以在IGroupingsIEnumerable中的每个组上调用OrderByDescending,这是Enumerable.GroupBy的返回类型(这里有文档)。

由于OrderByDescending将返回IEnumerable(而不是IGrouping),该操作将失去每个组的Key属性。如果您需要这样做,那么您可能希望简单地选择一个匿名类型来保存密钥。将最终的Select替换为:

 .Select(g => new { g.Key, elements = g.OrderByDescending(element => element.Name) });

或者,您可以按照这里的说明编写一些逻辑,在这里实例化IGrouping