c# - OrderBy [ Descending ]() 和 SkipWhile() 的意外行为

标签 c# linq

我看到了一些我很难理解的行为。给定一个 DateTime 列表,我只想按降序选择去年发生的日期。但是使用 OrderBy()OrderByDescending()SkipWhile() 的行为……很奇怪。给定一个从今天开始的列表,包括像这样的过去 100 个月:

List<DateTime> ldt = new List<DateTime>();
for (int i = 0; i < 100; i++)
{
    ldt.Add(DateTime.Now.AddMonths(-i));
}

我从以下代码开始:

ldt = ldt.OrderByDescending(date => date).
          SkipWhile(date => date <= DateTime.Now.AddYears(-1)).ToList();

这对列表进行了正确排序,但不会跳过任何记录。所以为了好玩,我尝试了这个(跳过今天之前的所有内容,即所有内容):

 ldt = ldt.OrderByDescending(date => date).
            SkipWhile(date => date <= DateTime.Now).ToList();

哪个有效。该列表为空。然后我尝试了以下(OrderBy 而不是 OrderByDescending):

ldt = ldt.OrderBy(date => date).
          SkipWhile(date => date <= DateTime.Now.AddYears(-1)).ToList(); 

这完全符合预期 - 列表已排序,日期已正确过滤。所以最终的结果是:

ldt = ldt.OrderBy(date => date).
          SkipWhile(date => date <= DateTime.Now.AddYears(-1)).ToList();
ldt = ldt.OrderByDescending(date => date).ToList();

跳过,然后重新排序。那我错过了什么?为什么其中一些有效,而另一些却以不可预知的方式中断?对于我要执行的操作,什么是正确的一行命令?

最佳答案

基本上,您需要 TakeWhile而不是 SkipWhile:

ldt = ldt.OrderByDescending(date => date)
         .TakeWhile(date => date > DateTime.Now)
         .ToList();

在您使用 OrderByDescending 之后,您要保留的条目是第一个...而 SkipWhile 假设您想要丢弃一些条目,然后保留其余的。

(或者您可以使用 Where 进行过滤,然后按照 Reed 的建议进行排序。两者都可以工作 Reed 的可能更有效。使用您认为更容易理解的任何一个。)

当您对这样的事情感到困惑时,有时值得在一张纸上写下数据示例。计算出每一步之后的序列是什么样的,然后下一步会做什么。

关于c# - OrderBy [ Descending ]() 和 SkipWhile() 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16824031/

相关文章:

c# - 无法连接到 ASP.Net 开发服务器问题

c# - 寻找一种更灵活的方法将定界字符串转换为 StringDictionary

c# - AcquireCredentialsHandle 返回大量到期时间

c# - 使用 Linq 加入多个 IEnumerable<>

c# - linq where 子句中的空值

c# - 实现企业许可证

c# - 开放泛型类型的 CaSTLe Windsor Complex 注册

c# - Linq 聚合累积的 bool 值

c# - 这比 Null Coalesce 运算符好在哪里?

c# - 选择所有列,但在 linq 中仅按一个分组