【问题标题】:Why does orderbydescending not rearranged a list?为什么 orderbydescending 不重新排列列表?
【发布时间】:2016-03-01 12:09:36
【问题描述】:

我是否正确理解 orderbydescending 实际上并没有重新排列列表的顺序?如果是这样,最好的方法是什么?

newList= myOldList.OrderByDescending(x => x.DateTime)
                            .ThenBy(x => x.Status)
                            .Where(x => x.Status != StatusEnum.Complete).ToList();

这似乎并没有真正重新排列它们,最有效的方法是什么?

谢谢。

【问题讨论】:

  • 以什么方式重新排列它们?
  • 在where子句之后尝试排序
  • 你能提供一个小样本来演示这个问题吗?如果您也想订购旧列表,则必须将 newList 重新分配给 myOldList
  • 您还应该注意,对枚举进行排序使用的是底层数值,而不是标签。如果 StatusEnum.Complete 的基础值为 1,而 StatusEnum.InProgress 的基础值为 0,则 InProgress 在排序输出中将位于 Complete 之前。

标签: c# linq generics


【解决方案1】:

您需要更改调用 Linq 查询链的顺序

newList= myOldList.Where(x => x.Status != StatusEnum.Complete).OrderByDescending(x => x.DateTime)
                        .ThenBy(x => x.Status)
                        .ToList();

【讨论】:

【解决方案2】:

您需要在过滤结果后对其进行排序,Where 返回 IEnumerable,而不是 IOrderedEnumerable

但是你说对集合使用 order 方法不会对集合本身进行排序是正确的。它确实返回集合的有序版本。

编辑:正如 Tim Schmelter 在 cmets 中所说,Where 不会更改顺序,但如果要对数据进行排序,最好返回适当的接口。

【讨论】:

  • 但是Where 不会改变顺序。无论如何,首先使用Where 会更好,因为要订购的东西更少。
  • 没有必要;如果您查询数据库;结果将是 IQueryable 而不是 IEnumerable。
  • @AlexSuleap:但它是关于一个列表,它是 Linq-To-Objects。
  • @AlexSuleap List 对于IQueryable 来说是个糟糕的名字;-)
  • 先排序再提取结果会比提取结果慢,比排序慢。原因:要对列表进行排序,linq 使用平均 O(n log n) 的快速排序。提取结果是 O(n)。对较小的列表进行排序会更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
相关资源
最近更新 更多