1

我对 Linq 查询有疑问。我有一个格式如下的查询,它返回一个按顶级分组并按字母顺序排列的顶级字符串的结果集。我想返回一个按顶级字符串排序的结果集(因此 group by 子句按字母顺序排序)和子级别字符串也按字母顺序排列(因此每个子组也按字母顺序排列)。我期待的是如下内容:

  • 一个
    • 一个
    • C
    • 一个
    • C

我的查询类似于以下内容:

records.results
       .Where(table => string.Compare(table, expected) == 0)
       .OrderByDescending(table => table.name)
       .GroupBy(table => table.name);
       .OrderBy(group => group.Key);

我希望 OrderByDescending 语句可以更改 groupby 子句中各个记录的顺序,但它没有任何影响。不过,我收到了组的有序结果。任何帮助表示赞赏!

4

1 回答 1

3

您的问题是您的最后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,因此我们可以调用您的中的OrderByDescending每个组,这是(记录在此处)的返回类型。 IEnumerableIGroupingsEnumerable.GroupBy

由于OrderByDescending将返回一个IEnumerable(而不是一个IGrouping),因此此操作将丢失Key每个组的属性。如果您需要,那么您可能只想选择一个匿名类型来保留密钥。将最终替换为Select

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

或者,您可以按照IGrouping此处的说明编写一些逻辑来实例化此处

于 2013-06-07T17:18:05.683 回答